diff --git a/legacy/Dockerfile b/legacy/Dockerfile deleted file mode 100644 index d981c25..0000000 --- a/legacy/Dockerfile +++ /dev/null @@ -1,70 +0,0 @@ -# Build stage -FROM golang:1-alpine as builder - -WORKDIR /app - -COPY ./share/we-lang/we-lang.go /app - -RUN apk add --no-cache git - - -RUN go get -u github.com/mattn/go-colorable && \ - go get -u github.com/klauspost/lctime && \ - go get -u github.com/mattn/go-runewidth && \ - CGO_ENABLED=0 go build /app/we-lang.go -# Results in /app/we-lang - - -FROM alpine:3 - -WORKDIR /app - -COPY ./requirements.txt /app - -ENV LLVM_CONFIG=/usr/bin/llvm9-config - -RUN apk add --no-cache --virtual .build \ - autoconf \ - automake \ - g++ \ - gcc \ - jpeg-dev \ - llvm9-dev\ - make \ - zlib-dev \ - && apk add --no-cache \ - python3 \ - py3-pip \ - py3-scipy \ - py3-wheel \ - py3-gevent \ - zlib \ - jpeg \ - llvm9 \ - libtool \ - supervisor \ - py3-numpy-dev \ - python3-dev && \ - mkdir -p /app/cache && \ - mkdir -p /var/log/supervisor && \ - mkdir -p /etc/supervisor/conf.d && \ - chmod -R o+rw /var/log/supervisor && \ - chmod -R o+rw /var/run && \ - pip install -r requirements.txt && \ - apk del --no-cache -r .build - -COPY --from=builder /app/we-lang /app/bin/we-lang -COPY ./bin /app/bin -COPY ./lib /app/lib -COPY ./share /app/share -COPY share/docker/supervisord.conf /etc/supervisor/supervisord.conf - -ENV WTTR_MYDIR="/app" -ENV WTTR_GEOLITE="/app/GeoLite2-City.mmdb" -ENV WTTR_WEGO="/app/bin/we-lang" -ENV WTTR_LISTEN_HOST="0.0.0.0" -ENV WTTR_LISTEN_PORT="8002" - -EXPOSE 8002 - -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] diff --git a/legacy/LICENSE b/legacy/LICENSE deleted file mode 100644 index 8f71f43..0000000 --- a/legacy/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/legacy/README.md b/legacy/README.md deleted file mode 100644 index 5990f04..0000000 --- a/legacy/README.md +++ /dev/null @@ -1,612 +0,0 @@ -*wttr.in — the right way to check the weather!* - -wttr.in is a console-oriented weather forecast service that supports various information -representation methods like terminal-oriented ANSI-sequences for console HTTP clients -(curl, httpie, or wget), HTML for web browsers, or PNG for graphical viewers. - -wttr.in uses [wego](http://github.com/schachmat/wego) for visualization -and various data sources for weather forecast information. - -You can see it running here: [wttr.in](http://wttr.in). - -## Usage - -You can access the service from a shell or from a Web browser like this: - - $ curl wttr.in - Weather for City: Paris, France - - \ / Clear - .-. 10 – 11 °C - ― ( ) ― ↑ 11 km/h - `-’ 10 km - / \ 0.0 mm - - -Here is an actual weather report for your location (it's live!): - -![Weather Report](http://wttr.in/MyLocation.png?) - -(It's not your actual location - GitHub's CDN hides your real IP address with its own IP address, -but it's still a live weather report in your language.) - -Or in PowerShell: - -```PowerShell -Invoke-RestMethod http://wttr.in -``` - -Want to get the weather information for a specific location? You can add the desired location to the URL in your -request like this: - - $ curl wttr.in/London - $ curl wttr.in/Moscow - $ curl wttr.in/Salt+Lake+City - -If you omit the location name, you will get the report for your current location based on your IP address. - -Use 3-letter airport codes in order to get the weather information at a certain airport: - - $ curl wttr.in/muc # Weather for IATA: muc, Munich International Airport, Germany - $ curl wttr.in/ham # Weather for IATA: ham, Hamburg Airport, Germany - -Let's say you'd like to get the weather for a geographical location other than a town or city - maybe an attraction -in a city, a mountain name, or some special location. Add the character `~` before the name to look up that special -location name before the weather is then retrieved: - - $ curl wttr.in/~Vostok+Station - $ curl wttr.in/~Eiffel+Tower - $ curl wttr.in/~Kilimanjaro - -For these examples, you'll see a line below the weather forecast output that shows the geolocation -results of looking up the location: - - Location: Vostok Station, станция Восток, AAT, Antarctica [-78.4642714,106.8364678] - Location: Tour Eiffel, 5, Avenue Anatole France, Gros-Caillou, 7e, Paris, Île-de-France, 75007, France [48.8582602,2.29449905432] - Location: Kilimanjaro, Northern, Tanzania [-3.4762789,37.3872648] - -You can also use IP-addresses (direct) or domain names (prefixed with `@`) to specify a location: - - $ curl wttr.in/@github.com - $ curl wttr.in/@msu.ru - -To get detailed information online, you can access the [/:help](http://wttr.in/:help) page: - - $ curl wttr.in/:help - - -### Weather Units - -By default the USCS units are used for the queries from the USA and the metric system for the rest of the world. -You can override this behavior by adding `?u` or `?m` to a URL like this: - - $ curl wttr.in/Amsterdam?u - $ curl wttr.in/Amsterdam?m - -## Supported output formats and views - -wttr.in currently supports five output formats: - -* ANSI for the terminal; -* Plain-text for the terminal and scripts; -* HTML for the browser; -* PNG for the graphical viewers; -* JSON for scripts and APIs; -* Prometheus metrics for scripts and APIs. - -The ANSI and HTML formats are selected basing on the User-Agent string. -The PNG format can be forced by adding `.png` to the end of the query: - - $ wget wttr.in/Paris.png - -You can use all of the options with the PNG-format like in an URL, but you have -to separate them with `_` instead of `?` and `&`: - - $ wget wttr.in/Paris_0tqp_lang=fr.png - -Useful options for the PNG format: - -* `t` for transparency (`transparency=150`); -* transparency=0..255 for a custom transparency level. - -Transparency is a useful feature when weather PNGs are used to add weather data to pictures: - - $ convert source.jpg <( curl wttr.in/Oymyakon_tqp0.png ) -geometry +50+50 -composite target.jpg - -In this example: - -* `source.jpg` - source file; -* `target.jpg` - target file; -* `Oymyakon` - name of the location; -* `tqp0` - options (recommended). - -![Picture with weather data](https://pbs.twimg.com/media/C69-wsIW0AAcAD5.jpg) - -You can embed a special wttr.in widget, that displays the weather condition for the current or a selected location, into a HTML page using the [wttr-switcher](https://github.com/midzer/wttr-switcher). That is how it looks like: [wttr-switcher-example](https://midzer.github.io/wttr-switcher/) or on a real world web site: https://feuerwehr-eisolzried.de/. - -![Embedded wttr.in example at feuerwehr-eisolzried.de](https://user-images.githubusercontent.com/3875145/65265457-50eac180-db11-11e9-8f9b-2e1711dfc436.png) - -## One-line output - -For one-line output format, specify additional URL parameter `format`: - -``` -$ curl wttr.in/Nuremberg?format=3 -Nuremberg: 🌦 +11⁰C -``` - -Available preconfigured formats: 1, 2, 3, 4 and the custom format using the percent notation (see below). - -You can specify multiple locations separated with `:` (for repeating queries): - -``` -$ curl wttr.in/Nuremberg:Hamburg:Berlin?format=3 -Nuremberg: 🌦 +11⁰C -``` -Or to process all this queries at once: - -``` -$ curl -s 'wttr.in/{Nuremberg,Hamburg,Berlin}?format=3' -Nuremberg: 🌦 +11⁰C -Hamburg: 🌦 +8⁰C -Berlin: 🌦 +8⁰C -``` - -To specify your own custom output format, use the special `%`-notation: - -``` - c Weather condition, - C Weather condition textual name, - h Humidity, - t Temperature (Actual), - f Temperature (Feels Like), - w Wind, - l Location, - m Moonphase 🌑🌒🌓🌔🌕🌖🌗🌘, - M Moonday, - p precipitation (mm), - o Probability of Precipitation, - P pressure (hPa), - - D Dawn*, - S Sunrise*, - z Zenith*, - s Sunset*, - d Dusk*. - -(*times are shown in the local timezone) -``` - -So, these two calls are the same: - -``` - $ curl wttr.in/London?format=3 - London: ⛅️ +7⁰C - $ curl wttr.in/London?format="%l:+%c+%t\n" - London: ⛅️ +7⁰C -``` -Keep in mind, that when using in `tmux.conf`, you have to escape `%` with `%`, i.e. write there `%%` instead of `%`. - -In programs, that are querying the service automatically (such as tmux), it is better to use some reasonable update interval. In tmux, you can configure it with `status-interval`. - -If several, `:` separated locations, are specified in the query, specify update period -as an additional query parameter `period=`: -``` -set -g status-interval 60 -WEATHER='#(curl -s wttr.in/London:Stockholm:Moscow\?format\="%%l:+%%c%%20%%t%%60%%w&period=60")' -set -g status-right "$WEATHER ..." -``` -![wttr.in in tmux status bar](https://wttr.in/files/example-tmux-status-line.png) - -To see emojis in terminal, you need: - -1. Terminal support for emojis (was added to Cairo 1.15.8); -2. Font with emojis support. - -For the Emoji font, we recommend *Noto Color Emoji*, and a good alternative option would be the *Emoji One* font; -both of them support all necessary emoji glyphs. - -Font configuration: - -```xml -$ cat ~/.config/fontconfig/fonts.conf - - - - - serif - - Noto Color Emoji - - - - sans-serif - - Noto Color Emoji - - - - monospace - - Noto Color Emoji - - - -``` - -(to apply the configuration, run `fc-cache -f -v`) - -## Data-rich output format - -In the experimental data-rich output format, that is available under the view code `v2`, -a lot of additional weather and astronomical information is available: - -* Temperature, and precepetation changes forecast throughout the days; -* Moonphase for today and the next three days; -* The current weather condition, temperature, humidity, windspeed and direction, pressure; -* Timezone; -* Dawn, sunrise, noon, sunset, dusk time for he selected location; -* Precise geographical coordinates for the selected location. - -``` - $ curl v2.wttr.in/München -``` - -or - -``` - $ curl wttr.in/München?format=v2 -``` - -or, if you prefer Nerd Fonts instead of Emoji, `v2d` (day) or `v2n` (night): - -``` - $ curl v2d.wttr.in/München -``` - - -![data-reach output format](https://wttr.in/files/example-wttr-v2.png) - -(The mode is experimental, and it has several limitations currently: - -* It works only in terminal; -* Only English is supported). - -Currently, you need some tweaks for some terminals, to get the best possible visualization. - -### URXVT - -Depending on your configuration you might be taking all steps, or only a few. URXVT currently doesn't support emoji related fonts, but we can get almost the same effect using *Font-Symbola*. So add to your `.Xresources` file the following line: -``` - xft:symbola:size=10:minspace=False -``` -You can add it _after_ your preferred font and it will only show up when required. -Then, if you see or feel like you're having spacing issues, add this: `URxvt.letterSpace: 0` -For some reason URXVT sometimes stops deciding right the word spacing and we need to force it this way. - -The result, should look like: - -![URXVT Emoji line](https://user-images.githubusercontent.com/24360204/63842949-1d36d480-c975-11e9-81dd-998d1329bd8a.png) - -## Different output formats - -### JSON output - -The JSON format is a feature providing access to *wttr.in* data through an easy-to-parse format, without requiring the user to create a complex script to reinterpret wttr.in's graphical output. - -To fetch information in JSON format, use the following syntax: - - $ curl wttr.in/Detroit?format=j1 - -This will fetch information on the Detroit region in JSON format. The j1 format code is used to allow for the use of other layouts for the JSON output. - -The result will look something like the following: -```json -{ - "current_condition": [ - { - "FeelsLikeC": "25", - "FeelsLikeF": "76", - "cloudcover": "100", - "humidity": "76", - "observation_time": "04:08 PM", - "precipMM": "0.2", - "pressure": "1019", - "temp_C": "22", - "temp_F": "72", - "uvIndex": 5, - "visibility": "16", - "weatherCode": "122", - "weatherDesc": [ - { - "value": "Overcast" - } - ], - "weatherIconUrl": [ - { - "value": "" - } - ], - "winddir16Point": "NNE", - "winddirDegree": "20", - "windspeedKmph": "7", - "windspeedMiles": "4" - } - ], -... -``` - -Most of these values are self-explanatory, aside from `weatherCode`. The `weatherCode` is an enumeration which you can find at either [the WorldWeatherOnline website](https://www.worldweatheronline.com/developer/api/docs/weather-icons.aspx) or [in the wttr.in source code](https://github.com/chubin/wttr.in/blob/master/lib/constants.py). - -### Prometheus Metrics Output - -The [Prometheus](https://github.com/prometheus/prometheus) Metrics format is a feature providing access to *wttr.in* data through an easy-to-parse format for monitoring systems, without requiring the user to create a complex script to reinterpret wttr.in's graphical output. - -To fetch information in Prometheus format, use the following syntax: - - $ curl wttr.in/Detroit?format=p1 - -This will fetch information on the Detroit region in Prometheus Metrics format. The `p1` format code is used to allow for the use of other layouts for the Prometheus Metrics output. - -A possible configuration for Prometheus could look like this: - -```yaml - - job_name: 'wttr_in_detroit' - static_configs: - - targets: ['wttr.in'] - metrics_path: '/Detroit' - params: - format: ['p1'] -``` - -The result will look something like the following: - - - # HELP temperature_feels_like_celsius Feels Like Temperature in Celsius - temperature_feels_like_celsius{forecast="current"} 7 - # HELP temperature_feels_like_fahrenheit Feels Like Temperature in Fahrenheit - temperature_feels_like_fahrenheit{forecast="current"} 45 - [truncated] -... - - -## Moon phases - -wttr.in can also be used to check the phase of the Moon. This example shows how to see the current Moon phase -in the full-output mode: - - $ curl wttr.in/Moon - -Get the Moon phase for a particular date by adding `@YYYY-MM-DD`: - - $ curl wttr.in/Moon@2016-12-25 - -The Moon phase information uses [pyphoon](https://github.com/chubin/pyphoon) as its backend. - -To get the moon phase information in the online mode, use `%m`: - - $ curl wttr.in/London?format=%m - 🌖 - -Keep in mind that the Unicode representation of moonphases suffers 2 caveats: - -- With some fonts, the representation `🌘` is ambiguous, for it either seem - almost-shadowed or almost-lit, depending on whether your terminal is in - light mode or dark mode. Relying on colored fonts like `noto-fonts` works - around this problem. - -- The representation `🌘` is also ambiguous, for it means "last quarter" in - northern hemisphere, but "first quarter" in souther hemisphere. It also means - nothing in tropical zones. This is a limitation that - [Unicode](https://www.unicode.org/L2/L2017/17304-moon-var.pdf) is aware about. - But it has not been worked around at `wttr.in` yet. - -See #247, #364 for the corresponding tracking issues, -and [pyphoon#1](https://github.com/chubin/pyphoon/issues/1) for pyphoon. Any help is welcome. - -## Internationalization and localization - -wttr.in supports multilingual locations names that can be specified in any language in the world -(it may be surprising, but many locations in the world don't have an English name). - -The query string should be specified in Unicode (hex-encoded or not). Spaces in the query string -must be replaced with `+`: - - $ curl wttr.in/станция+Восток - Weather report: станция Восток - - Overcast - .--. -65 – -47 °C - .-( ). ↑ 23 km/h - (___.__)__) 15 km - 0.0 mm - -The language used for the output (except the location name) does not depend on the input language -and it is either English (by default) or the preferred language of the browser (if the query -was issued from a browser) that is specified in the query headers (`Accept-Language`). - -The language can be set explicitly when using console clients by using command-line options like this: - - curl -H "Accept-Language: fr" wttr.in - http GET wttr.in Accept-Language:ru - -The preferred language can be forced using the `lang` option: - - $ curl wttr.in/Berlin?lang=de - -The third option is to choose the language using the DNS name used in the query: - - $ curl de.wttr.in/Berlin - -wttr.in is currently translated into 54 languages, and the number of supported languages is constantly growing. - -See [/:translation](http://wttr.in/:translation) to learn more about the translation process, -to see the list of supported languages and contributors, or to know how you can help to translate wttr.in -in your language. - -![Queries to wttr.in in various languages](https://pbs.twimg.com/media/C7hShiDXQAES6z1.jpg) - -## Windows Users - -There are currently two Windows related issues that prevent the examples found on this page from working exactly as expected out of the box. Until Microsoft fixes the issues, there are a few workarounds. To circumvent both issues you may use a shell such as `bash` on the [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install-win10) or read on for alternative solutions. - -### Garbage characters in the output -There is a limitation of the current Win32 version of `curl`. Until the [Win32 curl issue](https://github.com/chubin/wttr.in/issues/18#issuecomment-474145551) is resolved and rolled out in a future Windows release, it is recommended that you use Powershell’s `Invoke-Web-Request` command instead: -- `(Invoke-WebRequest http://wttr.in).Content` - -### Missing or double wide diagonal wind direction characters -The second issue is regarding the width of the diagonal arrow glyphs that some Windows Terminal Applications such as the default `conhost.exe` use. At the time of writing this, `ConEmu.exe`, `ConEmu64.exe` and Terminal Applications built on top of ConEmu such as Cmder (`cmder.exe`) use these double-wide glyphs by default. The result is the same with all of these programs, either a missing character for certain wind directions or a broken table in the output or both. Some third-party Terminal Applications have addressed the wind direction glyph issue but that fix depends on the font and the Terminal Application you are using. -One way to display the diagonal wind direction glyphs in your Terminal Application is to use [Windows Terminal](https://www.microsoft.com/en-us/p/windows-terminal-preview/9n0dx20hk701?activetab=pivot:overviewtab) which is currently available in the [Microsoft Store](https://www.microsoft.com/en-us/p/windows-terminal-preview/9n0dx20hk701?activetab=pivot:overviewtab). Windows Terminal is currently a preview release and will be rolled out as the default Terminal Application in an upcoming release. If your output is still skewed after using Windows Terminal then try maximizing the terminal window. -Another way you can display the diagonal wind direction is to swap out the problematic characters with forward and backward slashes as shown [here](https://github.com/chubin/wttr.in/issues/18#issuecomment-405640892). - -## Installation - -To install the application: - -1. Install external dependencies -2. Install Python dependencies used by the service -3. Configure IP2Location (optional) -4. Get a WorldWeatherOnline API and configure wego -5. Configure wttr.in -6. Configure the HTTP-frontend service - -### Install external dependencies - -wttr.in has the following external dependencies: - -* [golang](https://golang.org/doc/install), wego dependency -* [wego](https://github.com/schachmat/wego), weather client for terminal - -After you install [golang](https://golang.org/doc/install), install `wego`: - - $ go get -u github.com/schachmat/wego - $ go install github.com/schachmat/wego - -### Install Python dependencies - -Python requirements: - -* Flask -* geoip2 -* geopy -* requests -* gevent - -If you want to get weather reports as PNG files, you'll also need to install: - -* PIL -* pyte (>=0.6) -* necessary fonts - -You can install most of them using `pip`. - -Some python package use LLVM, so install it first: - - $ apt-get install llvm-7 llvm-7-dev - -If `virtualenv` is used: - - $ virtualenv -p python3 ve - $ ve/bin/pip3 install -r requirements.txt - $ ve/bin/python3 bin/srv.py - -Also, you need to install the geoip2 database. -You can use a free database GeoLite2 that can be downloaded from (http://dev.maxmind.com/geoip/geoip2/geolite2/). - -### Configure IP2Location (optional) - -If you want to use the IP2location service for IP-addresses that are not covered by GeoLite2, -you have to obtain a API key of that service, and after that save into the `~/.ip2location.key` file: - -``` -$ echo 'YOUR_IP2LOCATION_KEY' > ~/.ip2location.key -``` - -If you don't have this file, the service will be silently skipped (it is not a big problem, -because the MaxMind database is pretty good). - -### Installation with Docker - -* Install Docker -* Build Docker Image -* These files should be mounted by the user at runtime: - -``` -/root/.wegorc -/root/.ip2location.key (optional) -/app/airports.dat -/app/GeoLite2-City.mmdb -``` - -### Get a WorldWeatherOnline key and configure wego - -To get a WorldWeatherOnline API key, you must register here: - - https://developer.worldweatheronline.com/auth/register - -After you have a WorldWeatherOnline key, you can save it into the -WWO key file: `~/.wwo.key` - -Also, you have to specify the key in the `wego` configuration: - -```json -$ cat ~/.wegorc -{ - "APIKey": "00XXXXXXXXXXXXXXXXXXXXXXXXXXX", - "City": "London", - "Numdays": 3, - "Imperial": false, - "Lang": "en" -} -``` - -The `City` parameter in `~/.wegorc` is ignored. - -### Configure wttr.in - -Configure the following environment variables that define the path to the local `wttr.in` -installation, to the GeoLite database, and to the `wego` installation. For example: - -```bash -export WTTR_MYDIR="/home/igor/wttr.in" -export WTTR_GEOLITE="/home/igor/wttr.in/GeoLite2-City.mmdb" -export WTTR_WEGO="/home/igor/go/bin/wego" -export WTTR_LISTEN_HOST="0.0.0.0" -export WTTR_LISTEN_PORT="8002" -``` - - -### Configure the HTTP-frontend service - -It's recommended that you also configure the web server that will be used to access the service: - -```nginx -server { - listen [::]:80; - server_name wttr.in *.wttr.in; - access_log /var/log/nginx/wttr.in-access.log main; - error_log /var/log/nginx/wttr.in-error.log; - - location / { - proxy_pass http://127.0.0.1:8002; - - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $remote_addr; - - client_max_body_size 10m; - client_body_buffer_size 128k; - - proxy_connect_timeout 90; - proxy_send_timeout 90; - proxy_read_timeout 90; - - proxy_buffer_size 4k; - proxy_buffers 4 32k; - proxy_busy_buffers_size 64k; - proxy_temp_file_write_size 64k; - - expires off; - } -} -``` diff --git a/legacy/bin/geo-proxy.py b/legacy/bin/geo-proxy.py deleted file mode 100644 index cfe2e9f..0000000 --- a/legacy/bin/geo-proxy.py +++ /dev/null @@ -1,114 +0,0 @@ - -import gevent -from gevent.pywsgi import WSGIServer -from gevent.queue import Queue -from gevent.monkey import patch_all -from gevent.subprocess import Popen, PIPE, STDOUT -patch_all() - -import sys -import os -import json - -from flask import Flask, request, render_template, send_from_directory, send_file, make_response, jsonify, Response -app = Flask(__name__) - -MYDIR = os.path.abspath(os.path.dirname('__file__')) -sys.path.append(os.path.join(MYDIR, 'lib')) - -CACHEDIR = os.path.join(MYDIR, 'cache') - -from geopy.geocoders import Nominatim #, Mapzen -#geomapzen = Mapzen("mapzen-RBNbmcZ") # Nominatim() -geoosm = Nominatim(timeout=7, user_agent="wttrin-geo/0.0.2") - -import airports - -# from tzwhere import tzwhere -import timezonefinder -tf = timezonefinder.TimezoneFinder() - -def load_cache(location_string): - try: - location_string = location_string.replace('/', '_') - cachefile = os.path.join(CACHEDIR, location_string) - - return json.loads(open(cachefile, 'r').read()) - except: - return None - -def shorten_full_address(address): - parts = address.split(',') - if len(parts) > 6: - parts = parts[:2] + [x for x in parts[-4:] if len(x) < 20] - return ','.join(parts) - return address - - -def save_cache(location_string, answer): - location_string = location_string.replace('/', '_') - cachefile = os.path.join(CACHEDIR, location_string) - open(cachefile, 'w').write(json.dumps(answer)) - -def query_osm(location_string): - try: - location = geoosm.geocode(location_string) - return { - 'address': location.address, - 'latitude': location.latitude, - 'longitude':location.longitude, - } - - except Exception as e: - print(e) - return None - -def add_timezone_information(geo_data): - # tzwhere_ = tzwhere.tzwhere() - # timezone_str = tzwhere_.tzNameAt(geo_data["latitude"], geo_data["longitude"]) - timezone_str = tf.certain_timezone_at(lat=geo_data["latitude"], lng=geo_data["longitude"]) - - answer = geo_data.copy() - answer["timezone"] = timezone_str - - return answer - -@app.route("/") -def find_location(location): - - airport_gps_location = airports.get_airport_gps_location(location.upper().lstrip('~')) - is_airport = False - if airport_gps_location is not None: - location = airport_gps_location - is_airport = True - - location = location.replace('+', ' ') - answer = load_cache(location) - loaded_answer = None - - if answer is not None: - loaded_answer = answer.copy() - print("cache found: %s" % location) - - if answer is None: - answer = query_osm(location) - - if is_airport: - answer['address'] = shorten_full_address(answer['address']) - - if "timezone" not in answer: - answer = add_timezone_information(answer) - - if answer is not None and loaded_answer != answer: - save_cache(location, answer) - - if answer is None: - return "" - else: - r = Response(json.dumps(answer)) - r.headers["Content-Type"] = "text/json; charset=utf-8" - return r - -app.config['JSON_AS_ASCII'] = False -server = WSGIServer(("127.0.0.1", 8004), app) -server.serve_forever() diff --git a/legacy/bin/proxy.py b/legacy/bin/proxy.py deleted file mode 100755 index 09c24c2..0000000 --- a/legacy/bin/proxy.py +++ /dev/null @@ -1,291 +0,0 @@ -#vim: fileencoding=utf-8 - -""" - -The proxy server acts as a backend for the wttr.in service. - -It caches the answers and handles various data sources transforming their -answers into format supported by the wttr.in service. - -If WTTRIN_TEST is specified, it works in a special test mode: -it does not fetch and does not store the data in the cache, -but is using the fake data from "test/proxy-data". - -""" -from __future__ import print_function - -from gevent.pywsgi import WSGIServer -from gevent.monkey import patch_all -patch_all() - -# pylint: disable=wrong-import-position,wrong-import-order -import sys -import os -import time -import json -import hashlib - -import requests -import cyrtranslit - -from flask import Flask, request -APP = Flask(__name__) - - -MYDIR = os.path.abspath( - os.path.dirname(os.path.dirname('__file__'))) -sys.path.append("%s/lib/" % MYDIR) - -from globals import PROXY_CACHEDIR, PROXY_HOST, PROXY_PORT, USE_METNO, USER_AGENT -from metno import create_standard_json_from_metno, metno_request -from translations import PROXY_LANGS -# pylint: enable=wrong-import-position - -def is_testmode(): - """Server is running in the wttr.in test mode""" - - return "WTTRIN_TEST" in os.environ - -def load_translations(): - """ - load all translations - """ - translations = {} - - for f_name in PROXY_LANGS: - f_name = 'share/translations/%s.txt' % f_name - translation = {} - lang = f_name.split('/')[-1].split('.', 1)[0] - with open(f_name, "r") as f_file: - for line in f_file: - if ':' not in line: - continue - if line.count(':') == 3: - _, trans, orig, _ = line.strip().split(':', 4) - else: - _, trans, orig = line.strip().split(':', 3) - trans = trans.strip() - orig = orig.strip() - - translation[orig] = trans - translations[lang] = translation - return translations -TRANSLATIONS = load_translations() - -def _is_metno(): - return USE_METNO - -def _find_srv_for_query(path, query): # pylint: disable=unused-argument - if _is_metno(): - return 'https://api.met.no' - return 'http://api.worldweatheronline.com' - -def _cache_file(path, query): - """Return cache file name for specified `path` and `query` - and for the current time. - - Do smooth load on the server, expiration time - is slightly varied basing on the path+query sha1 hash digest. - """ - - digest = hashlib.sha1(("%s %s" % (path, query)).encode("utf-8")).hexdigest() - digest_number = ord(digest[0].upper()) - expiry_interval = 60*(digest_number+40) - - timestamp = "%010d" % (int(time.time())//expiry_interval*expiry_interval) - filename = os.path.join(PROXY_CACHEDIR, timestamp, path, query) - - return filename - - -def _load_content_and_headers(path, query): - if is_testmode(): - cache_file = "test/proxy-data/data1" - else: - cache_file = _cache_file(path, query) - try: - return (open(cache_file, 'r').read(), - json.loads(open(cache_file+".headers", 'r').read())) - except IOError: - return None, None - -def _touch_empty_file(path, query): - cache_file = _cache_file(path, query) - cache_dir = os.path.dirname(cache_file) - if not os.path.exists(cache_dir): - os.makedirs(cache_dir) - open(cache_file, 'w').write("") - -def _save_content_and_headers(path, query, content, headers): - cache_file = _cache_file(path, query) - cache_dir = os.path.dirname(cache_file) - if not os.path.exists(cache_dir): - os.makedirs(cache_dir) - open(cache_file + ".headers", 'w').write(json.dumps(headers)) - open(cache_file, 'wb').write(content) - -def translate(text, lang): - """ - Translate `text` into `lang` - """ - translated = TRANSLATIONS.get(lang, {}).get(text, text) - if text == translated: - print("%s: %s" % (lang, text)) - return translated - -def cyr(to_translate): - """ - Transliterate `to_translate` from latin into cyrillic - """ - return cyrtranslit.to_cyrillic(to_translate) - -def _patch_greek(original): - return original.replace(u"Ηλιόλουστη/ο", u"Ηλιόλουστη") - -def add_translations(content, lang): - """ - Add `lang` translation to `content` (JSON) - returned by the data source - """ - - if content == "{}": - return {} - - languages_to_translate = TRANSLATIONS.keys() - try: - d = json.loads(content) # pylint: disable=invalid-name - except (ValueError, TypeError) as exception: - print("---") - print(exception) - print("---") - return {} - - try: - weather_condition = d['data']['current_condition' - ][0]['weatherDesc'][0]['value'].capitalize() - d['data']['current_condition'][0]['weatherDesc'][0]['value'] = \ - weather_condition - if lang in languages_to_translate: - d['data']['current_condition'][0]['lang_%s' % lang] = \ - [{'value': translate(weather_condition, lang)}] - elif lang == 'sr': - d['data']['current_condition'][0]['lang_%s' % lang] = \ - [{'value': cyr( - d['data']['current_condition'][0]['lang_%s' % lang][0]['value']\ - )}] - elif lang == 'el': - d['data']['current_condition'][0]['lang_%s' % lang] = \ - [{'value': _patch_greek( - d['data']['current_condition'][0]['lang_%s' % lang][0]['value']\ - )}] - elif lang == 'sr-lat': - d['data']['current_condition'][0]['lang_%s' % lang] = \ - [{'value':d['data']['current_condition'][0]['lang_sr'][0]['value']\ - }] - - fixed_weather = [] - for w in d['data']['weather']: # pylint: disable=invalid-name - fixed_hourly = [] - for h in w['hourly']: # pylint: disable=invalid-name - weather_condition = h['weatherDesc'][0]['value'] - if lang in languages_to_translate: - h['lang_%s' % lang] = \ - [{'value': translate(weather_condition, lang)}] - elif lang == 'sr': - h['lang_%s' % lang] = \ - [{'value': cyr(h['lang_%s' % lang][0]['value'])}] - elif lang == 'el': - h['lang_%s' % lang] = \ - [{'value': _patch_greek(h['lang_%s' % lang][0]['value'])}] - elif lang == 'sr-lat': - h['lang_%s' % lang] = \ - [{'value': h['lang_sr'][0]['value']}] - fixed_hourly.append(h) - w['hourly'] = fixed_hourly - fixed_weather.append(w) - d['data']['weather'] = fixed_weather - - content = json.dumps(d) - except (IndexError, ValueError) as exception: - print(exception) - return content - -def _fetch_content_and_headers(path, query_string, **kwargs): - content, headers = _load_content_and_headers(path, query_string) - - if content is None: - srv = _find_srv_for_query(path, query_string) - url = '%s/%s?%s' % (srv, path, query_string) - - attempts = 10 - response = None - while attempts: - try: - response = requests.get(url, timeout=2, **kwargs) - except requests.ReadTimeout: - attempts -= 1 - continue - try: - json.loads(response.content) - break - except ValueError: - attempts -= 1 - - _touch_empty_file(path, query_string) - if response: - headers = {} - headers['Content-Type'] = response.headers['content-type'] - _save_content_and_headers(path, query_string, response.content, headers) - content = response.content - else: - content = "{}" - else: - print("cache found") - return content, headers - - -@APP.route("/") -def proxy(path): - """ - Main proxy function. Handles incoming HTTP queries. - """ - - lang = request.args.get('lang', 'en') - query_string = request.query_string.decode("utf-8") - query_string = query_string.replace('sr-lat', 'sr') - query_string = query_string.replace('lang=None', 'lang=en') - content = "" - headers = "" - if _is_metno(): - path, query, days = metno_request(path, query_string) - if USER_AGENT == '': - raise ValueError('User agent must be set to adhere to metno ToS: https://api.met.no/doc/TermsOfService') - content, headers = _fetch_content_and_headers(path, query, headers={ - 'User-Agent': USER_AGENT - }) - content = create_standard_json_from_metno(content, days) - else: - # WWO tweaks - query_string += "&extra=localObsTime" - query_string += "&includelocation=yes" - content, headers = _fetch_content_and_headers(path, query) - - content = add_translations(content, lang) - - return content, 200, headers - -if __name__ == "__main__": - #app.run(host='0.0.0.0', port=5001, debug=False) - #app.debug = True - if len(sys.argv) == 1: - bind_addr = "0.0.0.0" - SERVER = WSGIServer((bind_addr, PROXY_PORT), APP) - SERVER.serve_forever() - else: - print('running single request from command line arg') - APP.testing = True - with APP.test_client() as c: - resp = c.get(sys.argv[1]) - print('Status: ' + resp.status) - # print('Headers: ' + dumps(resp.headers)) - print(resp.data.decode('utf-8')) diff --git a/legacy/bin/srv.py b/legacy/bin/srv.py deleted file mode 100644 index 8d4f447..0000000 --- a/legacy/bin/srv.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -# vim: set encoding=utf-8 - -from gevent.pywsgi import WSGIServer -from gevent.monkey import patch_all -patch_all() - -# pylint: disable=wrong-import-position,wrong-import-order -import sys -import os -import jinja2 - -from flask import Flask, request, send_from_directory -APP = Flask(__name__) - -MYDIR = os.path.abspath( - os.path.dirname(os.path.dirname('__file__'))) -sys.path.append("%s/lib/" % MYDIR) - -import wttr_srv -from globals import TEMPLATES, STATIC, LISTEN_HOST, LISTEN_PORT -# pylint: enable=wrong-import-position,wrong-import-order - - -MY_LOADER = jinja2.ChoiceLoader([ - APP.jinja_loader, - jinja2.FileSystemLoader(TEMPLATES), -]) - -APP.jinja_loader = MY_LOADER - -@APP.route('/files/') -def send_static(path): - "Send any static file located in /files/" - return send_from_directory(STATIC, path) - -@APP.route('/favicon.ico') -def send_favicon(): - "Send static file favicon.ico" - return send_from_directory(STATIC, 'favicon.ico') - -@APP.route('/malformed-response.html') -def send_malformed(): - "Send static file malformed-response.html" - return send_from_directory(STATIC, 'malformed-response.html') - -@APP.route("/") -@APP.route("/") -def wttr(location=None): - "Main function wrapper" - return wttr_srv.wttr(location, request) - -SERVER = WSGIServer( - (LISTEN_HOST, int(os.environ.get('WTTRIN_SRV_PORT', LISTEN_PORT))), - APP) -SERVER.serve_forever() diff --git a/legacy/cmd/peakHandling.go b/legacy/cmd/peakHandling.go deleted file mode 100644 index eb98191..0000000 --- a/legacy/cmd/peakHandling.go +++ /dev/null @@ -1,79 +0,0 @@ -package main - -import ( - "log" - "net/http" - "sync" - "time" - - "github.com/robfig/cron" -) - -var peakRequest30 sync.Map -var peakRequest60 sync.Map - -func initPeakHandling() { - c := cron.New() - // cronTime := fmt.Sprintf("%d,%d * * * *", 30-prefetchInterval/60, 60-prefetchInterval/60) - c.AddFunc("24 * * * *", prefetchPeakRequests30) - c.AddFunc("54 * * * *", prefetchPeakRequests60) - c.Start() -} - -func savePeakRequest(cacheDigest string, r *http.Request) { - _, min, _ := time.Now().Clock() - if min == 30 { - peakRequest30.Store(cacheDigest, *r) - } else if min == 0 { - peakRequest60.Store(cacheDigest, *r) - } -} - -func prefetchRequest(r *http.Request) { - processRequest(r) -} - -func syncMapLen(sm *sync.Map) int { - count := 0 - - f := func(key, value interface{}) bool { - - // Not really certain about this part, don't know for sure - // if this is a good check for an entry's existence - if key == "" { - return false - } - count++ - - return true - } - - sm.Range(f) - - return count -} - -func prefetchPeakRequests(peakRequestMap *sync.Map) { - peakRequestLen := syncMapLen(peakRequestMap) - log.Printf("PREFETCH: Prefetching %d requests\n", peakRequestLen) - if peakRequestLen == 0 { - return - } - sleepBetweenRequests := time.Duration(prefetchInterval*1000/peakRequestLen) * time.Millisecond - peakRequestMap.Range(func(key interface{}, value interface{}) bool { - go func(r http.Request) { - prefetchRequest(&r) - }(value.(http.Request)) - peakRequestMap.Delete(key) - time.Sleep(sleepBetweenRequests) - return true - }) -} - -func prefetchPeakRequests30() { - prefetchPeakRequests(&peakRequest30) -} - -func prefetchPeakRequests60() { - prefetchPeakRequests(&peakRequest60) -} diff --git a/legacy/cmd/processRequest.go b/legacy/cmd/processRequest.go deleted file mode 100644 index 7c44a9f..0000000 --- a/legacy/cmd/processRequest.go +++ /dev/null @@ -1,147 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "log" - "math/rand" - "net" - "net/http" - "strings" - "time" -) - -func processRequest(r *http.Request) responseWithHeader { - var response responseWithHeader - - if dontCache(r) { - return get(r) - } - - cacheDigest := getCacheDigest(r) - - foundInCache := false - - savePeakRequest(cacheDigest, r) - - cacheBody, ok := lruCache.Get(cacheDigest) - if ok { - cacheEntry := cacheBody.(responseWithHeader) - - // if after all attempts we still have no answer, - // we try to make the query on our own - for attempts := 0; attempts < 300; attempts++ { - if !ok || !cacheEntry.InProgress { - break - } - time.Sleep(30 * time.Millisecond) - cacheBody, ok = lruCache.Get(cacheDigest) - cacheEntry = cacheBody.(responseWithHeader) - } - if cacheEntry.InProgress { - log.Printf("TIMEOUT: %s\n", cacheDigest) - } - if ok && !cacheEntry.InProgress && cacheEntry.Expires.After(time.Now()) { - response = cacheEntry - foundInCache = true - } - } - - if !foundInCache { - lruCache.Add(cacheDigest, responseWithHeader{InProgress: true}) - response = get(r) - if response.StatusCode == 200 || response.StatusCode == 304 { - lruCache.Add(cacheDigest, response) - } else { - log.Printf("REMOVE: %d response for %s from cache\n", response.StatusCode, cacheDigest) - lruCache.Remove(cacheDigest) - } - } - return response -} - -func get(req *http.Request) responseWithHeader { - - client := &http.Client{} - - queryURL := fmt.Sprintf("http://%s%s", req.Host, req.RequestURI) - - proxyReq, err := http.NewRequest(req.Method, queryURL, req.Body) - if err != nil { - log.Printf("Request: %s\n", err) - } - - // proxyReq.Header.Set("Host", req.Host) - // proxyReq.Header.Set("X-Forwarded-For", req.RemoteAddr) - - for header, values := range req.Header { - for _, value := range values { - proxyReq.Header.Add(header, value) - } - } - - res, err := client.Do(proxyReq) - - if err != nil { - panic(err) - } - - body, err := ioutil.ReadAll(res.Body) - if err != nil { - log.Println(err) - } - - return responseWithHeader{ - InProgress: false, - Expires: time.Now().Add(time.Duration(randInt(1000, 1500)) * time.Second), - Body: body, - Header: res.Header, - StatusCode: res.StatusCode, - } -} - -// implementation of the cache.get_signature of original wttr.in -func getCacheDigest(req *http.Request) string { - - userAgent := req.Header.Get("User-Agent") - - queryHost := req.Host - queryString := req.RequestURI - - clientIPAddress := readUserIP(req) - - lang := req.Header.Get("Accept-Language") - - return fmt.Sprintf("%s:%s%s:%s:%s", userAgent, queryHost, queryString, clientIPAddress, lang) -} - -// return true if request should not be cached -func dontCache(req *http.Request) bool { - - // dont cache cyclic requests - loc := strings.Split(req.RequestURI, "?")[0] - if strings.Contains(loc, ":") { - return true - } - return false -} - -func readUserIP(r *http.Request) string { - IPAddress := r.Header.Get("X-Real-Ip") - if IPAddress == "" { - IPAddress = r.Header.Get("X-Forwarded-For") - } - if IPAddress == "" { - IPAddress = r.RemoteAddr - var err error - IPAddress, _, err = net.SplitHostPort(IPAddress) - if err != nil { - log.Printf("ERROR: userip: %q is not IP:port\n", IPAddress) - } - } - return IPAddress -} - -func randInt(min int, max int) int { - return min + rand.Intn(max-min) -} diff --git a/legacy/cmd/srv.go b/legacy/cmd/srv.go deleted file mode 100644 index aae32d5..0000000 --- a/legacy/cmd/srv.go +++ /dev/null @@ -1,69 +0,0 @@ -package main - -import ( - "context" - "log" - "net" - "net/http" - "time" - - lru "github.com/hashicorp/golang-lru" -) - -const uplinkSrvAddr = "127.0.0.1:9002" -const uplinkTimeout = 30 -const prefetchInterval = 300 -const lruCacheSize = 12800 - -var lruCache *lru.Cache - -type responseWithHeader struct { - InProgress bool // true if the request is being processed - Expires time.Time // expiration time of the cache entry - - Body []byte - Header http.Header - StatusCode int // e.g. 200 -} - -func init() { - var err error - lruCache, err = lru.New(lruCacheSize) - if err != nil { - panic(err) - } - - dialer := &net.Dialer{ - Timeout: uplinkTimeout * time.Second, - KeepAlive: uplinkTimeout * time.Second, - DualStack: true, - } - - http.DefaultTransport.(*http.Transport).DialContext = func(ctx context.Context, network, _ string) (net.Conn, error) { - return dialer.DialContext(ctx, network, uplinkSrvAddr) - } - - initPeakHandling() -} - -func copyHeader(dst, src http.Header) { - for k, vv := range src { - for _, v := range vv { - dst.Add(k, v) - } - } -} - -func main() { - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - // printStat() - response := processRequest(r) - - copyHeader(w.Header(), response.Header) - w.Header().Set("Access-Control-Allow-Origin", "*") - w.WriteHeader(response.StatusCode) - w.Write(response.Body) - }) - - log.Fatal(http.ListenAndServe(":8082", nil)) -} diff --git a/legacy/cmd/stat.go b/legacy/cmd/stat.go deleted file mode 100644 index 1fc135e..0000000 --- a/legacy/cmd/stat.go +++ /dev/null @@ -1,40 +0,0 @@ -package main - -import ( - "log" - "sync" - "time" -) - -type safeCounter struct { - v map[int]int - mux sync.Mutex -} - -func (c *safeCounter) inc(key int) { - c.mux.Lock() - c.v[key]++ - c.mux.Unlock() -} - -// func (c *safeCounter) val(key int) int { -// c.mux.Lock() -// defer c.mux.Unlock() -// return c.v[key] -// } -// -// func (c *safeCounter) reset(key int) int { -// c.mux.Lock() -// defer c.mux.Unlock() -// result := c.v[key] -// c.v[key] = 0 -// return result -// } - -var queriesPerMinute safeCounter - -func printStat() { - _, min, _ := time.Now().Clock() - queriesPerMinute.inc(min) - log.Printf("Processed %d requests\n", min) -} diff --git a/legacy/lib/airports.py b/legacy/lib/airports.py deleted file mode 100644 index e950ceb..0000000 --- a/legacy/lib/airports.py +++ /dev/null @@ -1,22 +0,0 @@ -import csv - -AIRPORTS_DAT_FILE = '/home/igor/wttrin-geo/share/airports.dat' - -def load_aiports_index(): - file_ = open(AIRPORTS_DAT_FILE, "r") - reader = csv.reader(file_) - airport_index = {} - - for line in reader: - airport_index[line[4]] = line - - return airport_index - -AIRPORTS_INDEX = load_aiports_index() - -def get_airport_gps_location(iata_code): - if iata_code in AIRPORTS_INDEX: - airport = AIRPORTS_INDEX[iata_code] - return '%s,%s airport' % (airport[6], airport[7]) #, airport[1]) - return None - diff --git a/legacy/lib/buttons.py b/legacy/lib/buttons.py deleted file mode 100644 index bd79b4f..0000000 --- a/legacy/lib/buttons.py +++ /dev/null @@ -1,34 +0,0 @@ -TWITTER_BUTTON = """ - -""" - -GITHUB_BUTTON = """ -wttr.in -""" - -GITHUB_BUTTON_2 = """ - -wego -""" - -GITHUB_BUTTON_3 = """ - -pyphoon -""" - -GITHUB_BUTTON_FOOTER = """ - - -""" - -def add_buttons(output): - """ - Add buttons to html output - """ - - return output.replace('', - (TWITTER_BUTTON - + GITHUB_BUTTON - + GITHUB_BUTTON_3 - + GITHUB_BUTTON_2 - + GITHUB_BUTTON_FOOTER) + '') diff --git a/legacy/lib/cache.py b/legacy/lib/cache.py deleted file mode 100644 index fe257eb..0000000 --- a/legacy/lib/cache.py +++ /dev/null @@ -1,156 +0,0 @@ -""" -LRU-Cache implementation for formatted (`format=`) answers -""" - -import datetime -import re -import time -import os -import hashlib -import random - -import pytz -import pylru - -from globals import LRU_CACHE - -CACHE_SIZE = 10000 -CACHE = pylru.lrucache(CACHE_SIZE) - -# strings longer than this are stored not in ram -# but in the file cache -MIN_SIZE_FOR_FILECACHE = 80 - -def _update_answer(answer): - def _now_in_tz(timezone): - return datetime.datetime.now(pytz.timezone(timezone)).strftime("%H:%M:%S%z") - - if isinstance(answer, str) and "%{{NOW(" in answer: - answer = re.sub(r"%{{NOW\(([^}]*)\)}}", lambda x: _now_in_tz(x.group(1)), answer) - - return answer - -def get_signature(user_agent, query_string, client_ip_address, lang): - """ - Get cache signature based on `user_agent`, `url_string`, - `lang`, and `client_ip_address` - Return `None` if query should not be cached. - """ - - if "?" in query_string: - location = query_string.split("?", 1)[0] - else: - location = query_string - if location.startswith("http://"): - location = location[7:] - elif location.startswith("https://"): - location = location[8:] - if ":" in location: - return None - - signature = "%s:%s:%s:%s" % \ - (user_agent, query_string, client_ip_address, lang) - print(signature) - return signature - -def get(signature): - """ - If `update_answer` is not True, return answer as it is - stored in the cache. Otherwise update it, using - the `_update_answer` function. - """ - - if not signature: - return None - - value_record = CACHE.get(signature) - if not value_record: - return None - - value = value_record["val"] - expiry = value_record["expiry"] - if value and time.time() < expiry: - if value.startswith("file:") or value.startswith("bfile:"): - value = _read_from_file(signature, sighash=value) - if not value: - return None - return _update_answer(value) - return None - -def _randint(minimum, maximum): - return random.randrange(maximum - minimum) - -def store(signature, value): - """ - Store in cache `value` for `signature` - """ - if not signature: - return _update_answer(value) - - if len(value) >= MIN_SIZE_FOR_FILECACHE: - value_to_store = _store_in_file(signature, value) - else: - value_to_store = value - - value_record = { - "val": value_to_store, - "expiry": time.time() + _randint(1000, 2000), - } - - CACHE[signature] = value_record - - return _update_answer(value) - -def _hash(signature): - return hashlib.md5(signature.encode("utf-8")).hexdigest() - -def _store_in_file(signature, value): - """Store `value` for `signature` in cache file. - Return file name (signature_hash) as the result. - `value` can be string as well as bytes. - Returned filename is prefixed with "file:" (for text files) - or "bfile:" (for binary files). - """ - - signature_hash = _hash(signature) - filename = os.path.join(LRU_CACHE, signature_hash) - if not os.path.exists(LRU_CACHE): - os.makedirs(LRU_CACHE) - - if isinstance(value, bytes): - mode = "wb" - signature_hash = "bfile:%s" % signature_hash - else: - mode = "w" - signature_hash = "file:%s" % signature_hash - - with open(filename, mode) as f_cache: - f_cache.write(value) - return signature_hash - -def _read_from_file(signature, sighash=None): - """Read value for `signature` from cache file, - or return None if file is not found. - If `sighash` is specified, do not calculate file name - from signature, but use `sighash` instead. - - `sigash` can be prefixed with "file:" (for text files) - or "bfile:" (for binary files). - """ - - mode = "r" - if sighash: - if sighash.startswith("file:"): - sighash = sighash[5:] - elif sighash.startswith("bfile:"): - sighash = sighash[6:] - mode = "rb" - else: - sighash = _hash(signature) - - filename = os.path.join(LRU_CACHE, sighash) - if not os.path.exists(filename): - return None - - with open(filename, mode) as f_cache: - return f_cache.read() diff --git a/legacy/lib/constants.py b/legacy/lib/constants.py deleted file mode 100644 index 649cd08..0000000 --- a/legacy/lib/constants.py +++ /dev/null @@ -1,298 +0,0 @@ -#vim: fileencoding=utf-8 - -WWO_CODE = { - "113": "Sunny", - "116": "PartlyCloudy", - "119": "Cloudy", - "122": "VeryCloudy", - "143": "Fog", - "176": "LightShowers", - "179": "LightSleetShowers", - "182": "LightSleet", - "185": "LightSleet", - "200": "ThunderyShowers", - "227": "LightSnow", - "230": "HeavySnow", - "248": "Fog", - "260": "Fog", - "263": "LightShowers", - "266": "LightRain", - "281": "LightSleet", - "284": "LightSleet", - "293": "LightRain", - "296": "LightRain", - "299": "HeavyShowers", - "302": "HeavyRain", - "305": "HeavyShowers", - "308": "HeavyRain", - "311": "LightSleet", - "314": "LightSleet", - "317": "LightSleet", - "320": "LightSnow", - "323": "LightSnowShowers", - "326": "LightSnowShowers", - "329": "HeavySnow", - "332": "HeavySnow", - "335": "HeavySnowShowers", - "338": "HeavySnow", - "350": "LightSleet", - "353": "LightShowers", - "356": "HeavyShowers", - "359": "HeavyRain", - "362": "LightSleetShowers", - "365": "LightSleetShowers", - "368": "LightSnowShowers", - "371": "HeavySnowShowers", - "374": "LightSleetShowers", - "377": "LightSleet", - "386": "ThunderyShowers", - "389": "ThunderyHeavyRain", - "392": "ThunderySnowShowers", - "395": "HeavySnowShowers", -} - -WEATHER_SYMBOL = { - "Unknown": "✨", - "Cloudy": "☁️", - "Fog": "🌫", - "HeavyRain": "🌧", - "HeavyShowers": "🌧", - "HeavySnow": "❄️", - "HeavySnowShowers": "❄️", - "LightRain": "🌦", - "LightShowers": "🌦", - "LightSleet": "🌧", - "LightSleetShowers": "🌧", - "LightSnow": "🌨", - "LightSnowShowers": "🌨", - "PartlyCloudy": "⛅️", - "Sunny": "☀️", - "ThunderyHeavyRain": "🌩", - "ThunderyShowers": "⛈", - "ThunderySnowShowers": "⛈", - "VeryCloudy": "☁️", -} - -WEATHER_SYMBOL_WIDTH_VTE = { - "✨": 2, - "☁️": 1, - "🌫": 2, - "🌧": 2, - "🌧": 2, - "❄️": 1, - "❄️": 1, - "🌦": 1, - "🌦": 1, - "🌧": 1, - "🌧": 1, - "🌨": 2, - "🌨": 2, - "⛅️": 2, - "☀️": 1, - "🌩": 2, - "⛈": 1, - "⛈": 1, - "☁️": 1, -} - -WIND_DIRECTION = [ - "↓", "↙", "←", "↖", "↑", "↗", "→", "↘", -] - -MOON_PHASES = ( - "🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘" -) - -WEATHER_SYMBOL_WI_DAY = { - "Unknown": "", - "Cloudy": "", - "Fog": "", - "HeavyRain": "", - "HeavyShowers": "", - "HeavySnow": "", - "HeavySnowShowers": "", - "LightRain": "", - "LightShowers": "", - "LightSleet": "", - "LightSleetShowers": "", - "LightSnow": "", - "LightSnowShowers": "", - "PartlyCloudy": "", - "Sunny": "", - "ThunderyHeavyRain": "", - "ThunderyShowers": "", - "ThunderySnowShowers": "", - "VeryCloudy": "", -} - -WEATHER_SYMBOL_WI_NIGHT = { - "Unknown": "", - "Cloudy": "", - "Fog": "", - "HeavyRain": "", - "HeavyShowers": "", - "HeavySnow": "", - "HeavySnowShowers": "", - "LightRain": "", - "LightShowers": "", - "LightSleet": "", - "LightSleetShowers": "", - "LightSnow": "", - "LightSnowShowers": "", - "PartlyCloudy": "", - "Sunny": "", - "ThunderyHeavyRain": "", - "ThunderyShowers": "", - "ThunderySnowShowers": "", - "VeryCloudy": "", -} - -WEATHER_SYMBOL_WIDTH_VTE_WI = { -} - -WIND_DIRECTION_WI = [ - "", "", "", "", "", "", "", "", -] - -WIND_SCALE_WI = [ - "", "", "", "", "", "", "", "", "", "", "", "", "", -] - -MOON_PHASES_WI = ( - "", "", "", "", "", "", "", - "", "", "", "", "", "", "", - "", "", "", "", "", "", "", - "", "", "", "", "", "", "", -) - -WEATHER_SYMBOL_WEGO = { - "Unknown": [ - " .-. ", - " __) ", - " ( ", - " `-’ ", - " • "], - "Sunny": [ - "\033[38;5;226m \\ / \033[0m", - "\033[38;5;226m .-. \033[0m", - "\033[38;5;226m ― ( ) ― \033[0m", - "\033[38;5;226m `-’ \033[0m", - "\033[38;5;226m / \\ \033[0m"], - "PartlyCloudy": [ - "\033[38;5;226m \\ /\033[0m ", - "\033[38;5;226m _ /\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m \\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - " "], - "Cloudy": [ - " ", - "\033[38;5;250m .--. \033[0m", - "\033[38;5;250m .-( ). \033[0m", - "\033[38;5;250m (___.__)__) \033[0m", - " "], - "VeryCloudy": [ - " ", - "\033[38;5;240;1m .--. \033[0m", - "\033[38;5;240;1m .-( ). \033[0m", - "\033[38;5;240;1m (___.__)__) \033[0m", - " "], - "LightShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"], - "HeavyShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m", - "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m", - "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m", - "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"], - "LightSnowShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;255m * * * \033[0m", - "\033[38;5;255m * * * \033[0m"], - "HeavySnowShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m", - "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m", - "\033[38;5;255;1m * * * * \033[0m", - "\033[38;5;255;1m * * * * \033[0m"], - "LightSleetShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m", - "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"], - "ThunderyShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;228;5m ⚡\033[38;5;111;25m‘ ‘\033[38;5;228;5m⚡\033[38;5;111;25m‘ ‘ \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"], - "ThunderyHeavyRain": [ - "\033[38;5;240;1m .-. \033[0m", - "\033[38;5;240;1m ( ). \033[0m", - "\033[38;5;240;1m (___(__) \033[0m", - "\033[38;5;21;1m ‚‘\033[38;5;228;5m⚡\033[38;5;21;25m‘‚\033[38;5;228;5m⚡\033[38;5;21;25m‚‘ \033[0m", - "\033[38;5;21;1m ‚’‚’\033[38;5;228;5m⚡\033[38;5;21;25m’‚’ \033[0m"], - "ThunderySnowShowers": [ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;255m *\033[38;5;228;5m⚡\033[38;5;255;25m*\033[38;5;228;5m⚡\033[38;5;255;25m* \033[0m", - "\033[38;5;255m * * * \033[0m"], - "LightRain": [ - "\033[38;5;250m .-. \033[0m", - "\033[38;5;250m ( ). \033[0m", - "\033[38;5;250m (___(__) \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"], - "HeavyRain": [ - "\033[38;5;240;1m .-. \033[0m", - "\033[38;5;240;1m ( ). \033[0m", - "\033[38;5;240;1m (___(__) \033[0m", - "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m", - "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"], - "LightSnow": [ - "\033[38;5;250m .-. \033[0m", - "\033[38;5;250m ( ). \033[0m", - "\033[38;5;250m (___(__) \033[0m", - "\033[38;5;255m * * * \033[0m", - "\033[38;5;255m * * * \033[0m"], - "HeavySnow": [ - "\033[38;5;240;1m .-. \033[0m", - "\033[38;5;240;1m ( ). \033[0m", - "\033[38;5;240;1m (___(__) \033[0m", - "\033[38;5;255;1m * * * * \033[0m", - "\033[38;5;255;1m * * * * \033[0m"], - "LightSleet": [ - "\033[38;5;250m .-. \033[0m", - "\033[38;5;250m ( ). \033[0m", - "\033[38;5;250m (___(__) \033[0m", - "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m", - "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"], - "Fog": [ - " ", - "\033[38;5;251m _ - _ - _ - \033[0m", - "\033[38;5;251m _ - _ - _ \033[0m", - "\033[38;5;251m _ - _ - _ - \033[0m", - " "], -} - -LOCALE = { - "af": "af_ZA", "ar": "ar_TN", "az": "az_AZ", "be": "be_BY", "bg": "bg_BG", - "bs": "bs_BA", "ca": "ca_ES", "cs": "cs_CZ", "cy": "cy_GB", "da": "da_DK", - "de": "de_DE", "el": "el_GR", "eo": "eo", "es": "es_ES", "et": "et_EE", - "fa": "fa_IR", "fi": "fi_FI", "fr": "fr_FR", "fy": "fy_NL", "ga": "ga_IE", - "he": "he_IL", "hr": "hr_HR", "hu": "hu_HU", "hy": "hy_AM", "ia": "ia", - "id": "id_ID", "is": "is_IS", "it": "it_IT", "ja": "ja_JP", "jv": "en_US", - "ka": "ka_GE", "ko": "ko_KR", "kk": "kk_KZ", "ky": "ky_KG", "lt": "lt_LT", - "lv": "lv_LV", "mk": "mk_MK", "ml": "ml_IN", "nb": "nb_NO", "nl": "nl_NL", - "nn": "nn_NO", "pt": "pt_PT", "pt-br":"pt_BR", "pl": "pl_PL", "ro": "ro_RO", - "ru": "ru_RU", "sv": "sv_SE", "sk": "sk_SK", "sl": "sl_SI", "sr": "sr_RS", - "sr-lat": "sr_RS@latin", "sw": "sw_KE", "th": "th_TH", "tr": "tr_TR", "uk": "uk_UA", - "uz": "uz_UZ", "vi": "vi_VN", "zh": "zh_TW", "zu": "zu_ZA", -} diff --git a/legacy/lib/extract_emoji.py b/legacy/lib/extract_emoji.py deleted file mode 100644 index 8c42675..0000000 --- a/legacy/lib/extract_emoji.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python -#vim: fileencoding=utf-8 - -""" - -At the moment, Pillow library does not support colorful emojis, -that is why emojis must be extracted to external files first, -and then they must be handled as usual graphical objects -and not as text. - -The files are extracted using Imagemagick. - -Usage: - - ve/bi/python lib/extract_emoji.py -""" - -import subprocess - -EMOJIS = [ - "✨", - "☁️", - "🌫", - "🌧", - "🌧", - "❄️", - "❄️", - "🌦", - "🌦", - "🌧", - "🌧", - "🌨", - "🌨", - "⛅️", - "☀️", - "🌩", - "⛈", - "⛈", - "☁️", - "🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘" -] - -def extract_emojis_to_directory(dirname): - """ - Extract emoji from an emoji font, to separate files. - """ - - emoji_font = "Noto Color Emoji" - emoji_size = 30 - - for emoji in EMOJIS: - filename = "%s/%s.png" % (dirname, emoji) - convert_string = [ - "convert", "-background", "black", "-size", "%sx%s" % (emoji_size, emoji_size), - "-set", "colorspace", "sRGB", - "pango:%s" % (emoji_font, emoji), - filename - ] - subprocess.Popen(convert_string) - -if __name__ == '__main__': - extract_emojis_to_directory("share/emoji") diff --git a/legacy/lib/fields.py b/legacy/lib/fields.py deleted file mode 100644 index 3576ee5..0000000 --- a/legacy/lib/fields.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -Human readable description of the available data fields -describing current weather, weather forecast, and astronomical data -""" - -DESCRIPTION = { - # current condition fields - "FeelsLikeC": ( - "Feels Like Temperature in Celsius", - "temperature_feels_like_celsius"), - "FeelsLikeF": ( - "Feels Like Temperature in Fahrenheit", - "temperature_feels_like_fahrenheit"), - "cloudcover": ( - "Cloud Coverage in Percent", - "cloudcover_percentage"), - "humidity": ( - "Humidity in Percent", - "humidity_percentage"), - "precipMM": ( - "Precipitation (Rainfall) in mm", - "precipitation_mm"), - "pressure": ( - "Air pressure in hPa", - "pressure_hpa"), - "temp_C": ( - "Temperature in Celsius", - "temperature_celsius"), - "temp_F": ( - "Temperature in Fahrenheit", - "temperature_fahrenheit"), - "uvIndex": ( - "Ultaviolet Radiation Index", - "uv_index"), - "visibility": ( - "Visible Distance in Kilometres", - "visibility"), - "weatherCode": ( - "Code to describe Weather Condition", - "weather_code"), - "winddirDegree": ( - "Wind Direction in Degree", - "winddir_degree"), - "windspeedKmph": ( - "Wind Speed in Kilometres per Hour", - "windspeed_kmph"), - "windspeedMiles": ( - "Wind Speed in Miles per Hour", - "windspeed_mph"), - "observation_time": ( - "Minutes since start of the day the observation happened", - "observation_time"), - - # fields with `description` - "weatherDesc": ( - "Weather Description", - "weather_desc"), - "winddir16Point": ( - "Wind Direction on a 16-wind compass rose", - "winddir_16_point"), - - # forecast fields - "maxtempC": ( - "Maximum Temperature in Celsius", - "temperature_celsius_maximum"), - "maxtempF": ( - "Maximum Temperature in Fahrenheit", - "temperature_fahrenheit_maximum"), - "mintempC": ( - "Minimum Temperature in Celsius", - "temperature_celsius_minimum"), - "mintempF": ( - "Minimum Temperature in Fahrenheit", - "temperature_fahrenheit_minimum"), - "sunHour":( - "Hours of sunlight", - "sun_hour"), - "totalSnow_cm":( - "Total snowfall in cm", - "snowfall_cm"), - - # astronomy fields - "moon_illumination": ( - "Percentage of the moon illuminated", - "astronomy_moon_illumination"), - - # astronomy fields with description - "moon_phase": ( - "Phase of the moon", - "astronomy_moon_phase"), - - # astronomy fields with time - "moonrise": ( - "Minutes since start of the day untill the moon appears above the horizon", - "astronomy_moonrise_min"), - "moonset": ( - "Minutes since start of the day untill the moon disappears below the horizon", - "astronomy_moonset_min"), - "sunrise": ( - "Minutes since start of the day untill the sun appears above the horizon", - "astronomy_sunrise_min"), - "sunset": ( - "Minutes since start of the day untill the moon disappears below the horizon", - "astronomy_sunset_min"), - } diff --git a/legacy/lib/fmt/__init__.py b/legacy/lib/fmt/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/legacy/lib/fmt/png.py b/legacy/lib/fmt/png.py deleted file mode 100644 index 6f7f063..0000000 --- a/legacy/lib/fmt/png.py +++ /dev/null @@ -1,283 +0,0 @@ -#!/usr/bin/python -#vim: encoding=utf-8 -# pylint: disable=wrong-import-position,wrong-import-order,redefined-builtin - -""" -This module is used to generate png-files for wttr.in queries. -The only exported function is: - -* render_ansi(png_file, text, options=None) - -`render_ansi` is the main function of the module, -which does rendering of stream into a PNG-file. - -The module uses PIL for graphical tasks, and pyte for rendering -of ANSI stream into terminal representation. -""" - -from __future__ import print_function - -import sys -import io -import os -import glob - -from PIL import Image, ImageFont, ImageDraw -import pyte.screens -import emoji -import grapheme - -from . import unicodedata2 - -sys.path.insert(0, "..") -import constants -import globals - -COLS = 180 -ROWS = 100 -CHAR_WIDTH = 8 -CHAR_HEIGHT = 14 -FONT_SIZE = 13 -FONT_CAT = { - 'default': "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", - 'Cyrillic': "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", - 'Greek': "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", - 'Arabic': "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", - 'Hebrew': "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", - 'Han': "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc", - 'Hiragana': "/usr/share/fonts/truetype/motoya-l-cedar/MTLc3m.ttf", - 'Katakana': "/usr/share/fonts/truetype/motoya-l-cedar/MTLc3m.ttf", - 'Hangul': "/usr/share/fonts/truetype/lexi/LexiGulim.ttf", - 'Braille': "/usr/share/fonts/truetype/ancient-scripts/Symbola_hint.ttf", - 'Emoji': "/usr/share/fonts/truetype/ancient-scripts/Symbola_hint.ttf", -} - -# -# How to find font for non-standard scripts: -# -# $ fc-list :lang=ja -# -# GNU/Debian packages, that the fonts come from: -# -# * fonts-dejavu-core -# * fonts-wqy-zenhei (Han) -# * fonts-motoya-l-cedar (Hiragana/Katakana) -# * fonts-lexi-gulim (Hangul) -# * fonts-symbola (Braille/Emoji) -# - -def render_ansi(text, options=None): - """Render `text` (terminal sequence) in a PNG file - paying attention to passed command line `options`. - - Return: file content - """ - - screen = pyte.screens.Screen(COLS, ROWS) - screen.set_mode(pyte.modes.LNM) - stream = pyte.Stream(screen) - - text, graphemes = _fix_graphemes(text) - stream.feed(text) - - buf = sorted(screen.buffer.items(), key=lambda x: x[0]) - buf = [[x[1] for x in sorted(line[1].items(), key=lambda x: x[0])] for line in buf] - - return _gen_term(buf, graphemes, options=options) - -def _color_mapping(color): - """Convert pyte color to PIL color - - Return: tuple of color values (R,G,B) - """ - - if color == 'default': - return 'lightgray' - if color in ['green', 'black', 'cyan', 'blue', 'brown']: - return color - try: - return ( - int(color[0:2], 16), - int(color[2:4], 16), - int(color[4:6], 16)) - except (ValueError, IndexError): - # if we do not know this color and it can not be decoded as RGB, - # print it and return it as it is (will be displayed as black) - # print color - return color - return color - -def _strip_buf(buf): - """Strips empty spaces from behind and from the right side. - (from the right side is not yet implemented) - """ - - def empty_line(line): - "Returns True if the line consists from spaces" - return all(x.data == ' ' for x in line) - - def line_len(line): - "Returns len of the line excluding spaces from the right" - - last_pos = len(line) - while last_pos > 0 and line[last_pos-1].data == ' ': - last_pos -= 1 - return last_pos - - number_of_lines = 0 - for line in buf[::-1]: - if not empty_line(line): - break - number_of_lines += 1 - - if number_of_lines: - buf = buf[:-number_of_lines] - - max_len = max(line_len(x) for x in buf) - buf = [line[:max_len] for line in buf] - - return buf - -def _script_category(char): - """Returns category of a Unicode character - - Possible values: - default, Cyrillic, Greek, Han, Hiragana - """ - - if char in emoji.UNICODE_EMOJI: - return "Emoji" - - cat = unicodedata2.script_cat(char)[0] - if char == u':': - return 'Han' - if cat in ['Latin', 'Common']: - return 'default' - return cat - -def _load_emojilib(): - """Load known emojis from a directory, and return dictionary - of PIL Image objects correspodent to the loaded emojis. - Each emoji is resized to the CHAR_HEIGHT size. - """ - - emojilib = {} - for filename in glob.glob("share/emoji/*.png"): - character = os.path.basename(filename)[:-4] - emojilib[character] = \ - Image.open(filename).resize((CHAR_HEIGHT, CHAR_HEIGHT)) - return emojilib - -# pylint: disable=too-many-locals,too-many-branches,too-many-statements -def _gen_term(buf, graphemes, options=None): - """Renders rendered pyte buffer `buf` and list of workaround `graphemes` - to a PNG file, and return its content - """ - - if not options: - options = {} - - current_grapheme = 0 - - buf = _strip_buf(buf) - cols = max(len(x) for x in buf) - rows = len(buf) - - image = Image.new('RGB', (cols * CHAR_WIDTH, rows * CHAR_HEIGHT)) - - buf = buf[-ROWS:] - - draw = ImageDraw.Draw(image) - font = {} - for cat in FONT_CAT: - font[cat] = ImageFont.truetype(FONT_CAT[cat], FONT_SIZE) - - emojilib = _load_emojilib() - - x_pos = 0 - y_pos = 0 - for line in buf: - x_pos = 0 - for char in line: - current_color = _color_mapping(char.fg) - if char.bg != 'default': - draw.rectangle( - ((x_pos, y_pos), - (x_pos+CHAR_WIDTH, y_pos+CHAR_HEIGHT)), - fill=_color_mapping(char.bg)) - - if char.data == "!": - try: - data = graphemes[current_grapheme] - except IndexError: - pass - current_grapheme += 1 - else: - data = char.data - - if data: - cat = _script_category(data[0]) - if cat not in font: - globals.log("Unknown font category: %s" % cat) - if cat == 'Emoji' and emojilib.get(data): - image.paste(emojilib.get(data), (x_pos, y_pos)) - else: - draw.text( - (x_pos, y_pos), - data, - font=font.get(cat, font.get('default')), - fill=current_color) - - x_pos += CHAR_WIDTH * constants.WEATHER_SYMBOL_WIDTH_VTE.get(data, 1) - y_pos += CHAR_HEIGHT - - if 'transparency' in options: - transparency = options.get('transparency', '255') - try: - transparency = int(transparency) - except ValueError: - transparency = 255 - - if transparency < 0: - transparency = 0 - - if transparency > 255: - transparency = 255 - - image = image.convert("RGBA") - datas = image.getdata() - - new_data = [] - for item in datas: - new_item = tuple(list(item[:3]) + [transparency]) - new_data.append(new_item) - - image.putdata(new_data) - - img_bytes = io.BytesIO() - image.save(img_bytes, format="png") - return img_bytes.getvalue() - -def _fix_graphemes(text): - """ - Extract long graphemes sequences that can't be handled - by pyte correctly because of the bug pyte#131. - Graphemes are omited and replaced with placeholders, - and returned as a list. - - Return: - text_without_graphemes, graphemes - """ - - output = "" - graphemes = [] - - for gra in grapheme.graphemes(text): - if len(gra) > 1: - character = "!" - graphemes.append(gra) - else: - character = gra - output += character - - return output, graphemes diff --git a/legacy/lib/fmt/unicodedata2.py b/legacy/lib/fmt/unicodedata2.py deleted file mode 100644 index 45e7ec4..0000000 --- a/legacy/lib/fmt/unicodedata2.py +++ /dev/null @@ -1,612 +0,0 @@ -# downloaded from https://gist.github.com/2204527 -# described/recommended here: -# -# http://stackoverflow.com/questions/9868792/find-out-the-unicode-script-of-a-character -# - -from __future__ import print_function -from unicodedata import * - -script_data = { -"names":['Common', 'Latin', 'Greek', 'Cyrillic', 'Armenian', 'Hebrew', 'Arabic', -'Syriac', 'Thaana', 'Devanagari', 'Bengali', 'Gurmukhi', 'Gujarati', 'Oriya', -'Tamil', 'Telugu', 'Kannada', 'Malayalam', 'Sinhala', 'Thai', 'Lao', 'Tibetan', -'Myanmar', 'Georgian', 'Hangul', 'Ethiopic', 'Cherokee', 'Canadian_Aboriginal', -'Ogham', 'Runic', 'Khmer', 'Mongolian', 'Hiragana', 'Katakana', 'Bopomofo', -'Han', 'Yi', 'Old_Italic', 'Gothic', 'Deseret', 'Inherited', 'Tagalog', -'Hanunoo', 'Buhid', 'Tagbanwa', 'Limbu', 'Tai_Le', 'Linear_B', 'Ugaritic', -'Shavian', 'Osmanya', 'Cypriot', 'Braille', 'Buginese', 'Coptic', 'New_Tai_Lue', -'Glagolitic', 'Tifinagh', 'Syloti_Nagri', 'Old_Persian', 'Kharoshthi', -'Balinese', 'Cuneiform', 'Phoenician', 'Phags_Pa', 'Nko', 'Sundanese', 'Lepcha', -'Ol_Chiki', 'Vai', 'Saurashtra', 'Kayah_Li', 'Rejang', 'Lycian', 'Carian', -'Lydian', 'Cham', 'Tai_Tham', 'Tai_Viet', 'Avestan', 'Egyptian_Hieroglyphs', -'Samaritan', 'Lisu', 'Bamum', 'Javanese', 'Meetei_Mayek', 'Imperial_Aramaic', -'Old_South_Arabian', 'Inscriptional_Parthian', 'Inscriptional_Pahlavi', -'Old_Turkic', 'Kaithi', 'Batak', 'Brahmi', 'Mandaic', 'Chakma', -'Meroitic_Cursive', 'Meroitic_Hieroglyphs', 'Miao', 'Sharada', 'Sora_Sompeng', -'Takri'], -"cats":['Cc', 'Zs', 'Po', 'Sc', 'Ps', 'Pe', 'Sm', 'Pd', 'Nd', 'Sk', 'Pc', 'So', 'Pi', -'Cf', 'No', 'L', 'Pf', 'Lm', 'Mc', 'Lo', 'Zl', 'Zp', 'Nl', 'Mn', 'Me'], -"idx":[ -(0x0,0x1f,0,0), (0x20,0x20,0,1), (0x21,0x23,0,2), (0x24,0x24,0,3), -(0x25,0x27,0,2), (0x28,0x28,0,4), (0x29,0x29,0,5), (0x2a,0x2a,0,2), -(0x2b,0x2b,0,6), (0x2c,0x2c,0,2), (0x2d,0x2d,0,7), (0x2e,0x2f,0,2), -(0x30,0x39,0,8), (0x3a,0x3b,0,2), (0x3c,0x3e,0,6), (0x3f,0x40,0,2), -(0x41,0x5a,1,15), (0x5b,0x5b,0,4), (0x5c,0x5c,0,2), (0x5d,0x5d,0,5), -(0x5e,0x5e,0,9), (0x5f,0x5f,0,10), (0x60,0x60,0,9), (0x61,0x7a,1,15), -(0x7b,0x7b,0,4), (0x7c,0x7c,0,6), (0x7d,0x7d,0,5), (0x7e,0x7e,0,6), -(0x7f,0x9f,0,0), (0xa0,0xa0,0,1), (0xa1,0xa1,0,2), (0xa2,0xa5,0,3), -(0xa6,0xa6,0,11), (0xa7,0xa7,0,2), (0xa8,0xa8,0,9), (0xa9,0xa9,0,11), -(0xaa,0xaa,1,19), (0xab,0xab,0,12), (0xac,0xac,0,6), (0xad,0xad,0,13), -(0xae,0xae,0,11), (0xaf,0xaf,0,9), (0xb0,0xb0,0,11), (0xb1,0xb1,0,6), -(0xb2,0xb3,0,14), (0xb4,0xb4,0,9), (0xb5,0xb5,0,15), (0xb6,0xb7,0,2), -(0xb8,0xb8,0,9), (0xb9,0xb9,0,14), (0xba,0xba,1,19), (0xbb,0xbb,0,16), -(0xbc,0xbe,0,14), (0xbf,0xbf,0,2), (0xc0,0xd6,1,15), (0xd7,0xd7,0,6), -(0xd8,0xf6,1,15), (0xf7,0xf7,0,6), (0xf8,0x1ba,1,15), (0x1bb,0x1bb,1,19), -(0x1bc,0x1bf,1,15), (0x1c0,0x1c3,1,19), (0x1c4,0x293,1,15), (0x294,0x294,1,19), -(0x295,0x2af,1,15), (0x2b0,0x2b8,1,17), (0x2b9,0x2c1,0,17), (0x2c2,0x2c5,0,9), -(0x2c6,0x2d1,0,17), (0x2d2,0x2df,0,9), (0x2e0,0x2e4,1,17), (0x2e5,0x2e9,0,9), -(0x2ea,0x2eb,34,9), (0x2ec,0x2ec,0,17), (0x2ed,0x2ed,0,9), (0x2ee,0x2ee,0,17), -(0x2ef,0x2ff,0,9), (0x300,0x36f,40,23), (0x370,0x373,2,15), (0x374,0x374,0,17), -(0x375,0x375,2,9), (0x376,0x377,2,15), (0x37a,0x37a,2,17), (0x37b,0x37d,2,15), -(0x37e,0x37e,0,2), (0x384,0x384,2,9), (0x385,0x385,0,9), (0x386,0x386,2,15), -(0x387,0x387,0,2), (0x388,0x38a,2,15), (0x38c,0x38c,2,15), (0x38e,0x3a1,2,15), -(0x3a3,0x3e1,2,15), (0x3e2,0x3ef,54,15), (0x3f0,0x3f5,2,15), (0x3f6,0x3f6,2,6), -(0x3f7,0x3ff,2,15), (0x400,0x481,3,15), (0x482,0x482,3,11), (0x483,0x484,3,23), -(0x485,0x486,40,23), (0x487,0x487,3,23), (0x488,0x489,3,24), (0x48a,0x527,3,15), -(0x531,0x556,4,15), (0x559,0x559,4,17), (0x55a,0x55f,4,2), (0x561,0x587,4,15), -(0x589,0x589,0,2), (0x58a,0x58a,4,7), (0x58f,0x58f,4,3), (0x591,0x5bd,5,23), -(0x5be,0x5be,5,7), (0x5bf,0x5bf,5,23), (0x5c0,0x5c0,5,2), (0x5c1,0x5c2,5,23), -(0x5c3,0x5c3,5,2), (0x5c4,0x5c5,5,23), (0x5c6,0x5c6,5,2), (0x5c7,0x5c7,5,23), -(0x5d0,0x5ea,5,19), (0x5f0,0x5f2,5,19), (0x5f3,0x5f4,5,2), (0x600,0x604,6,13), -(0x606,0x608,6,6), (0x609,0x60a,6,2), (0x60b,0x60b,6,3), (0x60c,0x60c,0,2), -(0x60d,0x60d,6,2), (0x60e,0x60f,6,11), (0x610,0x61a,6,23), (0x61b,0x61b,0,2), -(0x61e,0x61e,6,2), (0x61f,0x61f,0,2), (0x620,0x63f,6,19), (0x640,0x640,0,17), -(0x641,0x64a,6,19), (0x64b,0x655,40,23), (0x656,0x65e,6,23), -(0x65f,0x65f,40,23), (0x660,0x669,0,8), (0x66a,0x66d,6,2), (0x66e,0x66f,6,19), -(0x670,0x670,40,23), (0x671,0x6d3,6,19), (0x6d4,0x6d4,6,2), (0x6d5,0x6d5,6,19), -(0x6d6,0x6dc,6,23), (0x6dd,0x6dd,0,13), (0x6de,0x6de,6,11), (0x6df,0x6e4,6,23), -(0x6e5,0x6e6,6,17), (0x6e7,0x6e8,6,23), (0x6e9,0x6e9,6,11), (0x6ea,0x6ed,6,23), -(0x6ee,0x6ef,6,19), (0x6f0,0x6f9,6,8), (0x6fa,0x6fc,6,19), (0x6fd,0x6fe,6,11), -(0x6ff,0x6ff,6,19), (0x700,0x70d,7,2), (0x70f,0x70f,7,13), (0x710,0x710,7,19), -(0x711,0x711,7,23), (0x712,0x72f,7,19), (0x730,0x74a,7,23), (0x74d,0x74f,7,19), -(0x750,0x77f,6,19), (0x780,0x7a5,8,19), (0x7a6,0x7b0,8,23), (0x7b1,0x7b1,8,19), -(0x7c0,0x7c9,65,8), (0x7ca,0x7ea,65,19), (0x7eb,0x7f3,65,23), -(0x7f4,0x7f5,65,17), (0x7f6,0x7f6,65,11), (0x7f7,0x7f9,65,2), -(0x7fa,0x7fa,65,17), (0x800,0x815,81,19), (0x816,0x819,81,23), -(0x81a,0x81a,81,17), (0x81b,0x823,81,23), (0x824,0x824,81,17), -(0x825,0x827,81,23), (0x828,0x828,81,17), (0x829,0x82d,81,23), -(0x830,0x83e,81,2), (0x840,0x858,94,19), (0x859,0x85b,94,23), -(0x85e,0x85e,94,2), (0x8a0,0x8a0,6,19), (0x8a2,0x8ac,6,19), (0x8e4,0x8fe,6,23), -(0x900,0x902,9,23), (0x903,0x903,9,18), (0x904,0x939,9,19), (0x93a,0x93a,9,23), -(0x93b,0x93b,9,18), (0x93c,0x93c,9,23), (0x93d,0x93d,9,19), (0x93e,0x940,9,18), -(0x941,0x948,9,23), (0x949,0x94c,9,18), (0x94d,0x94d,9,23), (0x94e,0x94f,9,18), -(0x950,0x950,9,19), (0x951,0x952,40,23), (0x953,0x957,9,23), (0x958,0x961,9,19), -(0x962,0x963,9,23), (0x964,0x965,0,2), (0x966,0x96f,9,8), (0x970,0x970,9,2), -(0x971,0x971,9,17), (0x972,0x977,9,19), (0x979,0x97f,9,19), (0x981,0x981,10,23), -(0x982,0x983,10,18), (0x985,0x98c,10,19), (0x98f,0x990,10,19), -(0x993,0x9a8,10,19), (0x9aa,0x9b0,10,19), (0x9b2,0x9b2,10,19), -(0x9b6,0x9b9,10,19), (0x9bc,0x9bc,10,23), (0x9bd,0x9bd,10,19), -(0x9be,0x9c0,10,18), (0x9c1,0x9c4,10,23), (0x9c7,0x9c8,10,18), -(0x9cb,0x9cc,10,18), (0x9cd,0x9cd,10,23), (0x9ce,0x9ce,10,19), -(0x9d7,0x9d7,10,18), (0x9dc,0x9dd,10,19), (0x9df,0x9e1,10,19), -(0x9e2,0x9e3,10,23), (0x9e6,0x9ef,10,8), (0x9f0,0x9f1,10,19), -(0x9f2,0x9f3,10,3), (0x9f4,0x9f9,10,14), (0x9fa,0x9fa,10,11), -(0x9fb,0x9fb,10,3), (0xa01,0xa02,11,23), (0xa03,0xa03,11,18), -(0xa05,0xa0a,11,19), (0xa0f,0xa10,11,19), (0xa13,0xa28,11,19), -(0xa2a,0xa30,11,19), (0xa32,0xa33,11,19), (0xa35,0xa36,11,19), -(0xa38,0xa39,11,19), (0xa3c,0xa3c,11,23), (0xa3e,0xa40,11,18), -(0xa41,0xa42,11,23), (0xa47,0xa48,11,23), (0xa4b,0xa4d,11,23), -(0xa51,0xa51,11,23), (0xa59,0xa5c,11,19), (0xa5e,0xa5e,11,19), -(0xa66,0xa6f,11,8), (0xa70,0xa71,11,23), (0xa72,0xa74,11,19), -(0xa75,0xa75,11,23), (0xa81,0xa82,12,23), (0xa83,0xa83,12,18), -(0xa85,0xa8d,12,19), (0xa8f,0xa91,12,19), (0xa93,0xaa8,12,19), -(0xaaa,0xab0,12,19), (0xab2,0xab3,12,19), (0xab5,0xab9,12,19), -(0xabc,0xabc,12,23), (0xabd,0xabd,12,19), (0xabe,0xac0,12,18), -(0xac1,0xac5,12,23), (0xac7,0xac8,12,23), (0xac9,0xac9,12,18), -(0xacb,0xacc,12,18), (0xacd,0xacd,12,23), (0xad0,0xad0,12,19), -(0xae0,0xae1,12,19), (0xae2,0xae3,12,23), (0xae6,0xaef,12,8), -(0xaf0,0xaf0,12,2), (0xaf1,0xaf1,12,3), (0xb01,0xb01,13,23), -(0xb02,0xb03,13,18), (0xb05,0xb0c,13,19), (0xb0f,0xb10,13,19), -(0xb13,0xb28,13,19), (0xb2a,0xb30,13,19), (0xb32,0xb33,13,19), -(0xb35,0xb39,13,19), (0xb3c,0xb3c,13,23), (0xb3d,0xb3d,13,19), -(0xb3e,0xb3e,13,18), (0xb3f,0xb3f,13,23), (0xb40,0xb40,13,18), -(0xb41,0xb44,13,23), (0xb47,0xb48,13,18), (0xb4b,0xb4c,13,18), -(0xb4d,0xb4d,13,23), (0xb56,0xb56,13,23), (0xb57,0xb57,13,18), -(0xb5c,0xb5d,13,19), (0xb5f,0xb61,13,19), (0xb62,0xb63,13,23), -(0xb66,0xb6f,13,8), (0xb70,0xb70,13,11), (0xb71,0xb71,13,19), -(0xb72,0xb77,13,14), (0xb82,0xb82,14,23), (0xb83,0xb83,14,19), -(0xb85,0xb8a,14,19), (0xb8e,0xb90,14,19), (0xb92,0xb95,14,19), -(0xb99,0xb9a,14,19), (0xb9c,0xb9c,14,19), (0xb9e,0xb9f,14,19), -(0xba3,0xba4,14,19), (0xba8,0xbaa,14,19), (0xbae,0xbb9,14,19), -(0xbbe,0xbbf,14,18), (0xbc0,0xbc0,14,23), (0xbc1,0xbc2,14,18), -(0xbc6,0xbc8,14,18), (0xbca,0xbcc,14,18), (0xbcd,0xbcd,14,23), -(0xbd0,0xbd0,14,19), (0xbd7,0xbd7,14,18), (0xbe6,0xbef,14,8), -(0xbf0,0xbf2,14,14), (0xbf3,0xbf8,14,11), (0xbf9,0xbf9,14,3), -(0xbfa,0xbfa,14,11), (0xc01,0xc03,15,18), (0xc05,0xc0c,15,19), -(0xc0e,0xc10,15,19), (0xc12,0xc28,15,19), (0xc2a,0xc33,15,19), -(0xc35,0xc39,15,19), (0xc3d,0xc3d,15,19), (0xc3e,0xc40,15,23), -(0xc41,0xc44,15,18), (0xc46,0xc48,15,23), (0xc4a,0xc4d,15,23), -(0xc55,0xc56,15,23), (0xc58,0xc59,15,19), (0xc60,0xc61,15,19), -(0xc62,0xc63,15,23), (0xc66,0xc6f,15,8), (0xc78,0xc7e,15,14), -(0xc7f,0xc7f,15,11), (0xc82,0xc83,16,18), (0xc85,0xc8c,16,19), -(0xc8e,0xc90,16,19), (0xc92,0xca8,16,19), (0xcaa,0xcb3,16,19), -(0xcb5,0xcb9,16,19), (0xcbc,0xcbc,16,23), (0xcbd,0xcbd,16,19), -(0xcbe,0xcbe,16,18), (0xcbf,0xcbf,16,23), (0xcc0,0xcc4,16,18), -(0xcc6,0xcc6,16,23), (0xcc7,0xcc8,16,18), (0xcca,0xccb,16,18), -(0xccc,0xccd,16,23), (0xcd5,0xcd6,16,18), (0xcde,0xcde,16,19), -(0xce0,0xce1,16,19), (0xce2,0xce3,16,23), (0xce6,0xcef,16,8), -(0xcf1,0xcf2,16,19), (0xd02,0xd03,17,18), (0xd05,0xd0c,17,19), -(0xd0e,0xd10,17,19), (0xd12,0xd3a,17,19), (0xd3d,0xd3d,17,19), -(0xd3e,0xd40,17,18), (0xd41,0xd44,17,23), (0xd46,0xd48,17,18), -(0xd4a,0xd4c,17,18), (0xd4d,0xd4d,17,23), (0xd4e,0xd4e,17,19), -(0xd57,0xd57,17,18), (0xd60,0xd61,17,19), (0xd62,0xd63,17,23), -(0xd66,0xd6f,17,8), (0xd70,0xd75,17,14), (0xd79,0xd79,17,11), -(0xd7a,0xd7f,17,19), (0xd82,0xd83,18,18), (0xd85,0xd96,18,19), -(0xd9a,0xdb1,18,19), (0xdb3,0xdbb,18,19), (0xdbd,0xdbd,18,19), -(0xdc0,0xdc6,18,19), (0xdca,0xdca,18,23), (0xdcf,0xdd1,18,18), -(0xdd2,0xdd4,18,23), (0xdd6,0xdd6,18,23), (0xdd8,0xddf,18,18), -(0xdf2,0xdf3,18,18), (0xdf4,0xdf4,18,2), (0xe01,0xe30,19,19), -(0xe31,0xe31,19,23), (0xe32,0xe33,19,19), (0xe34,0xe3a,19,23), -(0xe3f,0xe3f,0,3), (0xe40,0xe45,19,19), (0xe46,0xe46,19,17), -(0xe47,0xe4e,19,23), (0xe4f,0xe4f,19,2), (0xe50,0xe59,19,8), (0xe5a,0xe5b,19,2), -(0xe81,0xe82,20,19), (0xe84,0xe84,20,19), (0xe87,0xe88,20,19), -(0xe8a,0xe8a,20,19), (0xe8d,0xe8d,20,19), (0xe94,0xe97,20,19), -(0xe99,0xe9f,20,19), (0xea1,0xea3,20,19), (0xea5,0xea5,20,19), -(0xea7,0xea7,20,19), (0xeaa,0xeab,20,19), (0xead,0xeb0,20,19), -(0xeb1,0xeb1,20,23), (0xeb2,0xeb3,20,19), (0xeb4,0xeb9,20,23), -(0xebb,0xebc,20,23), (0xebd,0xebd,20,19), (0xec0,0xec4,20,19), -(0xec6,0xec6,20,17), (0xec8,0xecd,20,23), (0xed0,0xed9,20,8), -(0xedc,0xedf,20,19), (0xf00,0xf00,21,19), (0xf01,0xf03,21,11), -(0xf04,0xf12,21,2), (0xf13,0xf13,21,11), (0xf14,0xf14,21,2), -(0xf15,0xf17,21,11), (0xf18,0xf19,21,23), (0xf1a,0xf1f,21,11), -(0xf20,0xf29,21,8), (0xf2a,0xf33,21,14), (0xf34,0xf34,21,11), -(0xf35,0xf35,21,23), (0xf36,0xf36,21,11), (0xf37,0xf37,21,23), -(0xf38,0xf38,21,11), (0xf39,0xf39,21,23), (0xf3a,0xf3a,21,4), -(0xf3b,0xf3b,21,5), (0xf3c,0xf3c,21,4), (0xf3d,0xf3d,21,5), (0xf3e,0xf3f,21,18), -(0xf40,0xf47,21,19), (0xf49,0xf6c,21,19), (0xf71,0xf7e,21,23), -(0xf7f,0xf7f,21,18), (0xf80,0xf84,21,23), (0xf85,0xf85,21,2), -(0xf86,0xf87,21,23), (0xf88,0xf8c,21,19), (0xf8d,0xf97,21,23), -(0xf99,0xfbc,21,23), (0xfbe,0xfc5,21,11), (0xfc6,0xfc6,21,23), -(0xfc7,0xfcc,21,11), (0xfce,0xfcf,21,11), (0xfd0,0xfd4,21,2), -(0xfd5,0xfd8,0,11), (0xfd9,0xfda,21,2), (0x1000,0x102a,22,19), -(0x102b,0x102c,22,18), (0x102d,0x1030,22,23), (0x1031,0x1031,22,18), -(0x1032,0x1037,22,23), (0x1038,0x1038,22,18), (0x1039,0x103a,22,23), -(0x103b,0x103c,22,18), (0x103d,0x103e,22,23), (0x103f,0x103f,22,19), -(0x1040,0x1049,22,8), (0x104a,0x104f,22,2), (0x1050,0x1055,22,19), -(0x1056,0x1057,22,18), (0x1058,0x1059,22,23), (0x105a,0x105d,22,19), -(0x105e,0x1060,22,23), (0x1061,0x1061,22,19), (0x1062,0x1064,22,18), -(0x1065,0x1066,22,19), (0x1067,0x106d,22,18), (0x106e,0x1070,22,19), -(0x1071,0x1074,22,23), (0x1075,0x1081,22,19), (0x1082,0x1082,22,23), -(0x1083,0x1084,22,18), (0x1085,0x1086,22,23), (0x1087,0x108c,22,18), -(0x108d,0x108d,22,23), (0x108e,0x108e,22,19), (0x108f,0x108f,22,18), -(0x1090,0x1099,22,8), (0x109a,0x109c,22,18), (0x109d,0x109d,22,23), -(0x109e,0x109f,22,11), (0x10a0,0x10c5,23,15), (0x10c7,0x10c7,23,15), -(0x10cd,0x10cd,23,15), (0x10d0,0x10fa,23,19), (0x10fb,0x10fb,0,2), -(0x10fc,0x10fc,23,17), (0x10fd,0x10ff,23,19), (0x1100,0x11ff,24,19), -(0x1200,0x1248,25,19), (0x124a,0x124d,25,19), (0x1250,0x1256,25,19), -(0x1258,0x1258,25,19), (0x125a,0x125d,25,19), (0x1260,0x1288,25,19), -(0x128a,0x128d,25,19), (0x1290,0x12b0,25,19), (0x12b2,0x12b5,25,19), -(0x12b8,0x12be,25,19), (0x12c0,0x12c0,25,19), (0x12c2,0x12c5,25,19), -(0x12c8,0x12d6,25,19), (0x12d8,0x1310,25,19), (0x1312,0x1315,25,19), -(0x1318,0x135a,25,19), (0x135d,0x135f,25,23), (0x1360,0x1368,25,2), -(0x1369,0x137c,25,14), (0x1380,0x138f,25,19), (0x1390,0x1399,25,11), -(0x13a0,0x13f4,26,19), (0x1400,0x1400,27,7), (0x1401,0x166c,27,19), -(0x166d,0x166e,27,2), (0x166f,0x167f,27,19), (0x1680,0x1680,28,1), -(0x1681,0x169a,28,19), (0x169b,0x169b,28,4), (0x169c,0x169c,28,5), -(0x16a0,0x16ea,29,19), (0x16eb,0x16ed,0,2), (0x16ee,0x16f0,29,22), -(0x1700,0x170c,41,19), (0x170e,0x1711,41,19), (0x1712,0x1714,41,23), -(0x1720,0x1731,42,19), (0x1732,0x1734,42,23), (0x1735,0x1736,0,2), -(0x1740,0x1751,43,19), (0x1752,0x1753,43,23), (0x1760,0x176c,44,19), -(0x176e,0x1770,44,19), (0x1772,0x1773,44,23), (0x1780,0x17b3,30,19), -(0x17b4,0x17b5,30,23), (0x17b6,0x17b6,30,18), (0x17b7,0x17bd,30,23), -(0x17be,0x17c5,30,18), (0x17c6,0x17c6,30,23), (0x17c7,0x17c8,30,18), -(0x17c9,0x17d3,30,23), (0x17d4,0x17d6,30,2), (0x17d7,0x17d7,30,17), -(0x17d8,0x17da,30,2), (0x17db,0x17db,30,3), (0x17dc,0x17dc,30,19), -(0x17dd,0x17dd,30,23), (0x17e0,0x17e9,30,8), (0x17f0,0x17f9,30,14), -(0x1800,0x1801,31,2), (0x1802,0x1803,0,2), (0x1804,0x1804,31,2), -(0x1805,0x1805,0,2), (0x1806,0x1806,31,7), (0x1807,0x180a,31,2), -(0x180b,0x180d,31,23), (0x180e,0x180e,31,1), (0x1810,0x1819,31,8), -(0x1820,0x1842,31,19), (0x1843,0x1843,31,17), (0x1844,0x1877,31,19), -(0x1880,0x18a8,31,19), (0x18a9,0x18a9,31,23), (0x18aa,0x18aa,31,19), -(0x18b0,0x18f5,27,19), (0x1900,0x191c,45,19), (0x1920,0x1922,45,23), -(0x1923,0x1926,45,18), (0x1927,0x1928,45,23), (0x1929,0x192b,45,18), -(0x1930,0x1931,45,18), (0x1932,0x1932,45,23), (0x1933,0x1938,45,18), -(0x1939,0x193b,45,23), (0x1940,0x1940,45,11), (0x1944,0x1945,45,2), -(0x1946,0x194f,45,8), (0x1950,0x196d,46,19), (0x1970,0x1974,46,19), -(0x1980,0x19ab,55,19), (0x19b0,0x19c0,55,18), (0x19c1,0x19c7,55,19), -(0x19c8,0x19c9,55,18), (0x19d0,0x19d9,55,8), (0x19da,0x19da,55,14), -(0x19de,0x19df,55,11), (0x19e0,0x19ff,30,11), (0x1a00,0x1a16,53,19), -(0x1a17,0x1a18,53,23), (0x1a19,0x1a1b,53,18), (0x1a1e,0x1a1f,53,2), -(0x1a20,0x1a54,77,19), (0x1a55,0x1a55,77,18), (0x1a56,0x1a56,77,23), -(0x1a57,0x1a57,77,18), (0x1a58,0x1a5e,77,23), (0x1a60,0x1a60,77,23), -(0x1a61,0x1a61,77,18), (0x1a62,0x1a62,77,23), (0x1a63,0x1a64,77,18), -(0x1a65,0x1a6c,77,23), (0x1a6d,0x1a72,77,18), (0x1a73,0x1a7c,77,23), -(0x1a7f,0x1a7f,77,23), (0x1a80,0x1a89,77,8), (0x1a90,0x1a99,77,8), -(0x1aa0,0x1aa6,77,2), (0x1aa7,0x1aa7,77,17), (0x1aa8,0x1aad,77,2), -(0x1b00,0x1b03,61,23), (0x1b04,0x1b04,61,18), (0x1b05,0x1b33,61,19), -(0x1b34,0x1b34,61,23), (0x1b35,0x1b35,61,18), (0x1b36,0x1b3a,61,23), -(0x1b3b,0x1b3b,61,18), (0x1b3c,0x1b3c,61,23), (0x1b3d,0x1b41,61,18), -(0x1b42,0x1b42,61,23), (0x1b43,0x1b44,61,18), (0x1b45,0x1b4b,61,19), -(0x1b50,0x1b59,61,8), (0x1b5a,0x1b60,61,2), (0x1b61,0x1b6a,61,11), -(0x1b6b,0x1b73,61,23), (0x1b74,0x1b7c,61,11), (0x1b80,0x1b81,66,23), -(0x1b82,0x1b82,66,18), (0x1b83,0x1ba0,66,19), (0x1ba1,0x1ba1,66,18), -(0x1ba2,0x1ba5,66,23), (0x1ba6,0x1ba7,66,18), (0x1ba8,0x1ba9,66,23), -(0x1baa,0x1baa,66,18), (0x1bab,0x1bab,66,23), (0x1bac,0x1bad,66,18), -(0x1bae,0x1baf,66,19), (0x1bb0,0x1bb9,66,8), (0x1bba,0x1bbf,66,19), -(0x1bc0,0x1be5,92,19), (0x1be6,0x1be6,92,23), (0x1be7,0x1be7,92,18), -(0x1be8,0x1be9,92,23), (0x1bea,0x1bec,92,18), (0x1bed,0x1bed,92,23), -(0x1bee,0x1bee,92,18), (0x1bef,0x1bf1,92,23), (0x1bf2,0x1bf3,92,18), -(0x1bfc,0x1bff,92,2), (0x1c00,0x1c23,67,19), (0x1c24,0x1c2b,67,18), -(0x1c2c,0x1c33,67,23), (0x1c34,0x1c35,67,18), (0x1c36,0x1c37,67,23), -(0x1c3b,0x1c3f,67,2), (0x1c40,0x1c49,67,8), (0x1c4d,0x1c4f,67,19), -(0x1c50,0x1c59,68,8), (0x1c5a,0x1c77,68,19), (0x1c78,0x1c7d,68,17), -(0x1c7e,0x1c7f,68,2), (0x1cc0,0x1cc7,66,2), (0x1cd0,0x1cd2,40,23), -(0x1cd3,0x1cd3,0,2), (0x1cd4,0x1ce0,40,23), (0x1ce1,0x1ce1,0,18), -(0x1ce2,0x1ce8,40,23), (0x1ce9,0x1cec,0,19), (0x1ced,0x1ced,40,23), -(0x1cee,0x1cf1,0,19), (0x1cf2,0x1cf3,0,18), (0x1cf4,0x1cf4,40,23), -(0x1cf5,0x1cf6,0,19), (0x1d00,0x1d25,1,15), (0x1d26,0x1d2a,2,15), -(0x1d2b,0x1d2b,3,15), (0x1d2c,0x1d5c,1,17), (0x1d5d,0x1d61,2,17), -(0x1d62,0x1d65,1,17), (0x1d66,0x1d6a,2,17), (0x1d6b,0x1d77,1,15), -(0x1d78,0x1d78,3,17), (0x1d79,0x1d9a,1,15), (0x1d9b,0x1dbe,1,17), -(0x1dbf,0x1dbf,2,17), (0x1dc0,0x1de6,40,23), (0x1dfc,0x1dff,40,23), -(0x1e00,0x1eff,1,15), (0x1f00,0x1f15,2,15), (0x1f18,0x1f1d,2,15), -(0x1f20,0x1f45,2,15), (0x1f48,0x1f4d,2,15), (0x1f50,0x1f57,2,15), -(0x1f59,0x1f59,2,15), (0x1f5b,0x1f5b,2,15), (0x1f5d,0x1f5d,2,15), -(0x1f5f,0x1f7d,2,15), (0x1f80,0x1fb4,2,15), (0x1fb6,0x1fbc,2,15), -(0x1fbd,0x1fbd,2,9), (0x1fbe,0x1fbe,2,15), (0x1fbf,0x1fc1,2,9), -(0x1fc2,0x1fc4,2,15), (0x1fc6,0x1fcc,2,15), (0x1fcd,0x1fcf,2,9), -(0x1fd0,0x1fd3,2,15), (0x1fd6,0x1fdb,2,15), (0x1fdd,0x1fdf,2,9), -(0x1fe0,0x1fec,2,15), (0x1fed,0x1fef,2,9), (0x1ff2,0x1ff4,2,15), -(0x1ff6,0x1ffc,2,15), (0x1ffd,0x1ffe,2,9), (0x2000,0x200a,0,1), -(0x200b,0x200b,0,13), (0x200c,0x200d,40,13), (0x200e,0x200f,0,13), -(0x2010,0x2015,0,7), (0x2016,0x2017,0,2), (0x2018,0x2018,0,12), -(0x2019,0x2019,0,16), (0x201a,0x201a,0,4), (0x201b,0x201c,0,12), -(0x201d,0x201d,0,16), (0x201e,0x201e,0,4), (0x201f,0x201f,0,12), -(0x2020,0x2027,0,2), (0x2028,0x2028,0,20), (0x2029,0x2029,0,21), -(0x202a,0x202e,0,13), (0x202f,0x202f,0,1), (0x2030,0x2038,0,2), -(0x2039,0x2039,0,12), (0x203a,0x203a,0,16), (0x203b,0x203e,0,2), -(0x203f,0x2040,0,10), (0x2041,0x2043,0,2), (0x2044,0x2044,0,6), -(0x2045,0x2045,0,4), (0x2046,0x2046,0,5), (0x2047,0x2051,0,2), -(0x2052,0x2052,0,6), (0x2053,0x2053,0,2), (0x2054,0x2054,0,10), -(0x2055,0x205e,0,2), (0x205f,0x205f,0,1), (0x2060,0x2064,0,13), -(0x206a,0x206f,0,13), (0x2070,0x2070,0,14), (0x2071,0x2071,1,17), -(0x2074,0x2079,0,14), (0x207a,0x207c,0,6), (0x207d,0x207d,0,4), -(0x207e,0x207e,0,5), (0x207f,0x207f,1,17), (0x2080,0x2089,0,14), -(0x208a,0x208c,0,6), (0x208d,0x208d,0,4), (0x208e,0x208e,0,5), -(0x2090,0x209c,1,17), (0x20a0,0x20b9,0,3), (0x20d0,0x20dc,40,23), -(0x20dd,0x20e0,40,24), (0x20e1,0x20e1,40,23), (0x20e2,0x20e4,40,24), -(0x20e5,0x20f0,40,23), (0x2100,0x2101,0,11), (0x2102,0x2102,0,15), -(0x2103,0x2106,0,11), (0x2107,0x2107,0,15), (0x2108,0x2109,0,11), -(0x210a,0x2113,0,15), (0x2114,0x2114,0,11), (0x2115,0x2115,0,15), -(0x2116,0x2117,0,11), (0x2118,0x2118,0,6), (0x2119,0x211d,0,15), -(0x211e,0x2123,0,11), (0x2124,0x2124,0,15), (0x2125,0x2125,0,11), -(0x2126,0x2126,2,15), (0x2127,0x2127,0,11), (0x2128,0x2128,0,15), -(0x2129,0x2129,0,11), (0x212a,0x212b,1,15), (0x212c,0x212d,0,15), -(0x212e,0x212e,0,11), (0x212f,0x2131,0,15), (0x2132,0x2132,1,15), -(0x2133,0x2134,0,15), (0x2135,0x2138,0,19), (0x2139,0x2139,0,15), -(0x213a,0x213b,0,11), (0x213c,0x213f,0,15), (0x2140,0x2144,0,6), -(0x2145,0x2149,0,15), (0x214a,0x214a,0,11), (0x214b,0x214b,0,6), -(0x214c,0x214d,0,11), (0x214e,0x214e,1,15), (0x214f,0x214f,0,11), -(0x2150,0x215f,0,14), (0x2160,0x2182,1,22), (0x2183,0x2184,1,15), -(0x2185,0x2188,1,22), (0x2189,0x2189,0,14), (0x2190,0x2194,0,6), -(0x2195,0x2199,0,11), (0x219a,0x219b,0,6), (0x219c,0x219f,0,11), -(0x21a0,0x21a0,0,6), (0x21a1,0x21a2,0,11), (0x21a3,0x21a3,0,6), -(0x21a4,0x21a5,0,11), (0x21a6,0x21a6,0,6), (0x21a7,0x21ad,0,11), -(0x21ae,0x21ae,0,6), (0x21af,0x21cd,0,11), (0x21ce,0x21cf,0,6), -(0x21d0,0x21d1,0,11), (0x21d2,0x21d2,0,6), (0x21d3,0x21d3,0,11), -(0x21d4,0x21d4,0,6), (0x21d5,0x21f3,0,11), (0x21f4,0x22ff,0,6), -(0x2300,0x2307,0,11), (0x2308,0x230b,0,6), (0x230c,0x231f,0,11), -(0x2320,0x2321,0,6), (0x2322,0x2328,0,11), (0x2329,0x2329,0,4), -(0x232a,0x232a,0,5), (0x232b,0x237b,0,11), (0x237c,0x237c,0,6), -(0x237d,0x239a,0,11), (0x239b,0x23b3,0,6), (0x23b4,0x23db,0,11), -(0x23dc,0x23e1,0,6), (0x23e2,0x23f3,0,11), (0x2400,0x2426,0,11), -(0x2440,0x244a,0,11), (0x2460,0x249b,0,14), (0x249c,0x24e9,0,11), -(0x24ea,0x24ff,0,14), (0x2500,0x25b6,0,11), (0x25b7,0x25b7,0,6), -(0x25b8,0x25c0,0,11), (0x25c1,0x25c1,0,6), (0x25c2,0x25f7,0,11), -(0x25f8,0x25ff,0,6), (0x2600,0x266e,0,11), (0x266f,0x266f,0,6), -(0x2670,0x26ff,0,11), (0x2701,0x2767,0,11), (0x2768,0x2768,0,4), -(0x2769,0x2769,0,5), (0x276a,0x276a,0,4), (0x276b,0x276b,0,5), -(0x276c,0x276c,0,4), (0x276d,0x276d,0,5), (0x276e,0x276e,0,4), -(0x276f,0x276f,0,5), (0x2770,0x2770,0,4), (0x2771,0x2771,0,5), -(0x2772,0x2772,0,4), (0x2773,0x2773,0,5), (0x2774,0x2774,0,4), -(0x2775,0x2775,0,5), (0x2776,0x2793,0,14), (0x2794,0x27bf,0,11), -(0x27c0,0x27c4,0,6), (0x27c5,0x27c5,0,4), (0x27c6,0x27c6,0,5), -(0x27c7,0x27e5,0,6), (0x27e6,0x27e6,0,4), (0x27e7,0x27e7,0,5), -(0x27e8,0x27e8,0,4), (0x27e9,0x27e9,0,5), (0x27ea,0x27ea,0,4), -(0x27eb,0x27eb,0,5), (0x27ec,0x27ec,0,4), (0x27ed,0x27ed,0,5), -(0x27ee,0x27ee,0,4), (0x27ef,0x27ef,0,5), (0x27f0,0x27ff,0,6), -(0x2800,0x28ff,52,11), (0x2900,0x2982,0,6), (0x2983,0x2983,0,4), -(0x2984,0x2984,0,5), (0x2985,0x2985,0,4), (0x2986,0x2986,0,5), -(0x2987,0x2987,0,4), (0x2988,0x2988,0,5), (0x2989,0x2989,0,4), -(0x298a,0x298a,0,5), (0x298b,0x298b,0,4), (0x298c,0x298c,0,5), -(0x298d,0x298d,0,4), (0x298e,0x298e,0,5), (0x298f,0x298f,0,4), -(0x2990,0x2990,0,5), (0x2991,0x2991,0,4), (0x2992,0x2992,0,5), -(0x2993,0x2993,0,4), (0x2994,0x2994,0,5), (0x2995,0x2995,0,4), -(0x2996,0x2996,0,5), (0x2997,0x2997,0,4), (0x2998,0x2998,0,5), -(0x2999,0x29d7,0,6), (0x29d8,0x29d8,0,4), (0x29d9,0x29d9,0,5), -(0x29da,0x29da,0,4), (0x29db,0x29db,0,5), (0x29dc,0x29fb,0,6), -(0x29fc,0x29fc,0,4), (0x29fd,0x29fd,0,5), (0x29fe,0x2aff,0,6), -(0x2b00,0x2b2f,0,11), (0x2b30,0x2b44,0,6), (0x2b45,0x2b46,0,11), -(0x2b47,0x2b4c,0,6), (0x2b50,0x2b59,0,11), (0x2c00,0x2c2e,56,15), -(0x2c30,0x2c5e,56,15), (0x2c60,0x2c7b,1,15), (0x2c7c,0x2c7d,1,17), -(0x2c7e,0x2c7f,1,15), (0x2c80,0x2ce4,54,15), (0x2ce5,0x2cea,54,11), -(0x2ceb,0x2cee,54,15), (0x2cef,0x2cf1,54,23), (0x2cf2,0x2cf3,54,15), -(0x2cf9,0x2cfc,54,2), (0x2cfd,0x2cfd,54,14), (0x2cfe,0x2cff,54,2), -(0x2d00,0x2d25,23,15), (0x2d27,0x2d27,23,15), (0x2d2d,0x2d2d,23,15), -(0x2d30,0x2d67,57,19), (0x2d6f,0x2d6f,57,17), (0x2d70,0x2d70,57,2), -(0x2d7f,0x2d7f,57,23), (0x2d80,0x2d96,25,19), (0x2da0,0x2da6,25,19), -(0x2da8,0x2dae,25,19), (0x2db0,0x2db6,25,19), (0x2db8,0x2dbe,25,19), -(0x2dc0,0x2dc6,25,19), (0x2dc8,0x2dce,25,19), (0x2dd0,0x2dd6,25,19), -(0x2dd8,0x2dde,25,19), (0x2de0,0x2dff,3,23), (0x2e00,0x2e01,0,2), -(0x2e02,0x2e02,0,12), (0x2e03,0x2e03,0,16), (0x2e04,0x2e04,0,12), -(0x2e05,0x2e05,0,16), (0x2e06,0x2e08,0,2), (0x2e09,0x2e09,0,12), -(0x2e0a,0x2e0a,0,16), (0x2e0b,0x2e0b,0,2), (0x2e0c,0x2e0c,0,12), -(0x2e0d,0x2e0d,0,16), (0x2e0e,0x2e16,0,2), (0x2e17,0x2e17,0,7), -(0x2e18,0x2e19,0,2), (0x2e1a,0x2e1a,0,7), (0x2e1b,0x2e1b,0,2), -(0x2e1c,0x2e1c,0,12), (0x2e1d,0x2e1d,0,16), (0x2e1e,0x2e1f,0,2), -(0x2e20,0x2e20,0,12), (0x2e21,0x2e21,0,16), (0x2e22,0x2e22,0,4), -(0x2e23,0x2e23,0,5), (0x2e24,0x2e24,0,4), (0x2e25,0x2e25,0,5), -(0x2e26,0x2e26,0,4), (0x2e27,0x2e27,0,5), (0x2e28,0x2e28,0,4), -(0x2e29,0x2e29,0,5), (0x2e2a,0x2e2e,0,2), (0x2e2f,0x2e2f,0,17), -(0x2e30,0x2e39,0,2), (0x2e3a,0x2e3b,0,7), (0x2e80,0x2e99,35,11), -(0x2e9b,0x2ef3,35,11), (0x2f00,0x2fd5,35,11), (0x2ff0,0x2ffb,0,11), -(0x3000,0x3000,0,1), (0x3001,0x3003,0,2), (0x3004,0x3004,0,11), -(0x3005,0x3005,35,17), (0x3006,0x3006,0,19), (0x3007,0x3007,35,22), -(0x3008,0x3008,0,4), (0x3009,0x3009,0,5), (0x300a,0x300a,0,4), -(0x300b,0x300b,0,5), (0x300c,0x300c,0,4), (0x300d,0x300d,0,5), -(0x300e,0x300e,0,4), (0x300f,0x300f,0,5), (0x3010,0x3010,0,4), -(0x3011,0x3011,0,5), (0x3012,0x3013,0,11), (0x3014,0x3014,0,4), -(0x3015,0x3015,0,5), (0x3016,0x3016,0,4), (0x3017,0x3017,0,5), -(0x3018,0x3018,0,4), (0x3019,0x3019,0,5), (0x301a,0x301a,0,4), -(0x301b,0x301b,0,5), (0x301c,0x301c,0,7), (0x301d,0x301d,0,4), -(0x301e,0x301f,0,5), (0x3020,0x3020,0,11), (0x3021,0x3029,35,22), -(0x302a,0x302d,40,23), (0x302e,0x302f,24,18), (0x3030,0x3030,0,7), -(0x3031,0x3035,0,17), (0x3036,0x3037,0,11), (0x3038,0x303a,35,22), -(0x303b,0x303b,35,17), (0x303c,0x303c,0,19), (0x303d,0x303d,0,2), -(0x303e,0x303f,0,11), (0x3041,0x3096,32,19), (0x3099,0x309a,40,23), -(0x309b,0x309c,0,9), (0x309d,0x309e,32,17), (0x309f,0x309f,32,19), -(0x30a0,0x30a0,0,7), (0x30a1,0x30fa,33,19), (0x30fb,0x30fb,0,2), -(0x30fc,0x30fc,0,17), (0x30fd,0x30fe,33,17), (0x30ff,0x30ff,33,19), -(0x3105,0x312d,34,19), (0x3131,0x318e,24,19), (0x3190,0x3191,0,11), -(0x3192,0x3195,0,14), (0x3196,0x319f,0,11), (0x31a0,0x31ba,34,19), -(0x31c0,0x31e3,0,11), (0x31f0,0x31ff,33,19), (0x3200,0x321e,24,11), -(0x3220,0x3229,0,14), (0x322a,0x3247,0,11), (0x3248,0x324f,0,14), -(0x3250,0x3250,0,11), (0x3251,0x325f,0,14), (0x3260,0x327e,24,11), -(0x327f,0x327f,0,11), (0x3280,0x3289,0,14), (0x328a,0x32b0,0,11), -(0x32b1,0x32bf,0,14), (0x32c0,0x32cf,0,11), (0x32d0,0x32fe,33,11), -(0x3300,0x3357,33,11), (0x3358,0x33ff,0,11), (0x3400,0x4db5,35,19), -(0x4dc0,0x4dff,0,11), (0x4e00,0x9fcc,35,19), (0xa000,0xa014,36,19), -(0xa015,0xa015,36,17), (0xa016,0xa48c,36,19), (0xa490,0xa4c6,36,11), -(0xa4d0,0xa4f7,82,19), (0xa4f8,0xa4fd,82,17), (0xa4fe,0xa4ff,82,2), -(0xa500,0xa60b,69,19), (0xa60c,0xa60c,69,17), (0xa60d,0xa60f,69,2), -(0xa610,0xa61f,69,19), (0xa620,0xa629,69,8), (0xa62a,0xa62b,69,19), -(0xa640,0xa66d,3,15), (0xa66e,0xa66e,3,19), (0xa66f,0xa66f,3,23), -(0xa670,0xa672,3,24), (0xa673,0xa673,3,2), (0xa674,0xa67d,3,23), -(0xa67e,0xa67e,3,2), (0xa67f,0xa67f,3,17), (0xa680,0xa697,3,15), -(0xa69f,0xa69f,3,23), (0xa6a0,0xa6e5,83,19), (0xa6e6,0xa6ef,83,22), -(0xa6f0,0xa6f1,83,23), (0xa6f2,0xa6f7,83,2), (0xa700,0xa716,0,9), -(0xa717,0xa71f,0,17), (0xa720,0xa721,0,9), (0xa722,0xa76f,1,15), -(0xa770,0xa770,1,17), (0xa771,0xa787,1,15), (0xa788,0xa788,0,17), -(0xa789,0xa78a,0,9), (0xa78b,0xa78e,1,15), (0xa790,0xa793,1,15), -(0xa7a0,0xa7aa,1,15), (0xa7f8,0xa7f9,1,17), (0xa7fa,0xa7fa,1,15), -(0xa7fb,0xa7ff,1,19), (0xa800,0xa801,58,19), (0xa802,0xa802,58,23), -(0xa803,0xa805,58,19), (0xa806,0xa806,58,23), (0xa807,0xa80a,58,19), -(0xa80b,0xa80b,58,23), (0xa80c,0xa822,58,19), (0xa823,0xa824,58,18), -(0xa825,0xa826,58,23), (0xa827,0xa827,58,18), (0xa828,0xa82b,58,11), -(0xa830,0xa835,0,14), (0xa836,0xa837,0,11), (0xa838,0xa838,0,3), -(0xa839,0xa839,0,11), (0xa840,0xa873,64,19), (0xa874,0xa877,64,2), -(0xa880,0xa881,70,18), (0xa882,0xa8b3,70,19), (0xa8b4,0xa8c3,70,18), -(0xa8c4,0xa8c4,70,23), (0xa8ce,0xa8cf,70,2), (0xa8d0,0xa8d9,70,8), -(0xa8e0,0xa8f1,9,23), (0xa8f2,0xa8f7,9,19), (0xa8f8,0xa8fa,9,2), -(0xa8fb,0xa8fb,9,19), (0xa900,0xa909,71,8), (0xa90a,0xa925,71,19), -(0xa926,0xa92d,71,23), (0xa92e,0xa92f,71,2), (0xa930,0xa946,72,19), -(0xa947,0xa951,72,23), (0xa952,0xa953,72,18), (0xa95f,0xa95f,72,2), -(0xa960,0xa97c,24,19), (0xa980,0xa982,84,23), (0xa983,0xa983,84,18), -(0xa984,0xa9b2,84,19), (0xa9b3,0xa9b3,84,23), (0xa9b4,0xa9b5,84,18), -(0xa9b6,0xa9b9,84,23), (0xa9ba,0xa9bb,84,18), (0xa9bc,0xa9bc,84,23), -(0xa9bd,0xa9c0,84,18), (0xa9c1,0xa9cd,84,2), (0xa9cf,0xa9cf,84,17), -(0xa9d0,0xa9d9,84,8), (0xa9de,0xa9df,84,2), (0xaa00,0xaa28,76,19), -(0xaa29,0xaa2e,76,23), (0xaa2f,0xaa30,76,18), (0xaa31,0xaa32,76,23), -(0xaa33,0xaa34,76,18), (0xaa35,0xaa36,76,23), (0xaa40,0xaa42,76,19), -(0xaa43,0xaa43,76,23), (0xaa44,0xaa4b,76,19), (0xaa4c,0xaa4c,76,23), -(0xaa4d,0xaa4d,76,18), (0xaa50,0xaa59,76,8), (0xaa5c,0xaa5f,76,2), -(0xaa60,0xaa6f,22,19), (0xaa70,0xaa70,22,17), (0xaa71,0xaa76,22,19), -(0xaa77,0xaa79,22,11), (0xaa7a,0xaa7a,22,19), (0xaa7b,0xaa7b,22,18), -(0xaa80,0xaaaf,78,19), (0xaab0,0xaab0,78,23), (0xaab1,0xaab1,78,19), -(0xaab2,0xaab4,78,23), (0xaab5,0xaab6,78,19), (0xaab7,0xaab8,78,23), -(0xaab9,0xaabd,78,19), (0xaabe,0xaabf,78,23), (0xaac0,0xaac0,78,19), -(0xaac1,0xaac1,78,23), (0xaac2,0xaac2,78,19), (0xaadb,0xaadc,78,19), -(0xaadd,0xaadd,78,17), (0xaade,0xaadf,78,2), (0xaae0,0xaaea,85,19), -(0xaaeb,0xaaeb,85,18), (0xaaec,0xaaed,85,23), (0xaaee,0xaaef,85,18), -(0xaaf0,0xaaf1,85,2), (0xaaf2,0xaaf2,85,19), (0xaaf3,0xaaf4,85,17), -(0xaaf5,0xaaf5,85,18), (0xaaf6,0xaaf6,85,23), (0xab01,0xab06,25,19), -(0xab09,0xab0e,25,19), (0xab11,0xab16,25,19), (0xab20,0xab26,25,19), -(0xab28,0xab2e,25,19), (0xabc0,0xabe2,85,19), (0xabe3,0xabe4,85,18), -(0xabe5,0xabe5,85,23), (0xabe6,0xabe7,85,18), (0xabe8,0xabe8,85,23), -(0xabe9,0xabea,85,18), (0xabeb,0xabeb,85,2), (0xabec,0xabec,85,18), -(0xabed,0xabed,85,23), (0xabf0,0xabf9,85,8), (0xac00,0xd7a3,24,19), -(0xd7b0,0xd7c6,24,19), (0xd7cb,0xd7fb,24,19), (0xf900,0xfa6d,35,19), -(0xfa70,0xfad9,35,19), (0xfb00,0xfb06,1,15), (0xfb13,0xfb17,4,15), -(0xfb1d,0xfb1d,5,19), (0xfb1e,0xfb1e,5,23), (0xfb1f,0xfb28,5,19), -(0xfb29,0xfb29,5,6), (0xfb2a,0xfb36,5,19), (0xfb38,0xfb3c,5,19), -(0xfb3e,0xfb3e,5,19), (0xfb40,0xfb41,5,19), (0xfb43,0xfb44,5,19), -(0xfb46,0xfb4f,5,19), (0xfb50,0xfbb1,6,19), (0xfbb2,0xfbc1,6,9), -(0xfbd3,0xfd3d,6,19), (0xfd3e,0xfd3e,0,4), (0xfd3f,0xfd3f,0,5), -(0xfd50,0xfd8f,6,19), (0xfd92,0xfdc7,6,19), (0xfdf0,0xfdfb,6,19), -(0xfdfc,0xfdfc,6,3), (0xfdfd,0xfdfd,0,11), (0xfe00,0xfe0f,40,23), -(0xfe10,0xfe16,0,2), (0xfe17,0xfe17,0,4), (0xfe18,0xfe18,0,5), -(0xfe19,0xfe19,0,2), (0xfe20,0xfe26,40,23), (0xfe30,0xfe30,0,2), -(0xfe31,0xfe32,0,7), (0xfe33,0xfe34,0,10), (0xfe35,0xfe35,0,4), -(0xfe36,0xfe36,0,5), (0xfe37,0xfe37,0,4), (0xfe38,0xfe38,0,5), -(0xfe39,0xfe39,0,4), (0xfe3a,0xfe3a,0,5), (0xfe3b,0xfe3b,0,4), -(0xfe3c,0xfe3c,0,5), (0xfe3d,0xfe3d,0,4), (0xfe3e,0xfe3e,0,5), -(0xfe3f,0xfe3f,0,4), (0xfe40,0xfe40,0,5), (0xfe41,0xfe41,0,4), -(0xfe42,0xfe42,0,5), (0xfe43,0xfe43,0,4), (0xfe44,0xfe44,0,5), -(0xfe45,0xfe46,0,2), (0xfe47,0xfe47,0,4), (0xfe48,0xfe48,0,5), -(0xfe49,0xfe4c,0,2), (0xfe4d,0xfe4f,0,10), (0xfe50,0xfe52,0,2), -(0xfe54,0xfe57,0,2), (0xfe58,0xfe58,0,7), (0xfe59,0xfe59,0,4), -(0xfe5a,0xfe5a,0,5), (0xfe5b,0xfe5b,0,4), (0xfe5c,0xfe5c,0,5), -(0xfe5d,0xfe5d,0,4), (0xfe5e,0xfe5e,0,5), (0xfe5f,0xfe61,0,2), -(0xfe62,0xfe62,0,6), (0xfe63,0xfe63,0,7), (0xfe64,0xfe66,0,6), -(0xfe68,0xfe68,0,2), (0xfe69,0xfe69,0,3), (0xfe6a,0xfe6b,0,2), -(0xfe70,0xfe74,6,19), (0xfe76,0xfefc,6,19), (0xfeff,0xfeff,0,13), -(0xff01,0xff03,0,2), (0xff04,0xff04,0,3), (0xff05,0xff07,0,2), -(0xff08,0xff08,0,4), (0xff09,0xff09,0,5), (0xff0a,0xff0a,0,2), -(0xff0b,0xff0b,0,6), (0xff0c,0xff0c,0,2), (0xff0d,0xff0d,0,7), -(0xff0e,0xff0f,0,2), (0xff10,0xff19,0,8), (0xff1a,0xff1b,0,2), -(0xff1c,0xff1e,0,6), (0xff1f,0xff20,0,2), (0xff21,0xff3a,1,15), -(0xff3b,0xff3b,0,4), (0xff3c,0xff3c,0,2), (0xff3d,0xff3d,0,5), -(0xff3e,0xff3e,0,9), (0xff3f,0xff3f,0,10), (0xff40,0xff40,0,9), -(0xff41,0xff5a,1,15), (0xff5b,0xff5b,0,4), (0xff5c,0xff5c,0,6), -(0xff5d,0xff5d,0,5), (0xff5e,0xff5e,0,6), (0xff5f,0xff5f,0,4), -(0xff60,0xff60,0,5), (0xff61,0xff61,0,2), (0xff62,0xff62,0,4), -(0xff63,0xff63,0,5), (0xff64,0xff65,0,2), (0xff66,0xff6f,33,19), -(0xff70,0xff70,0,17), (0xff71,0xff9d,33,19), (0xff9e,0xff9f,0,17), -(0xffa0,0xffbe,24,19), (0xffc2,0xffc7,24,19), (0xffca,0xffcf,24,19), -(0xffd2,0xffd7,24,19), (0xffda,0xffdc,24,19), (0xffe0,0xffe1,0,3), -(0xffe2,0xffe2,0,6), (0xffe3,0xffe3,0,9), (0xffe4,0xffe4,0,11), -(0xffe5,0xffe6,0,3), (0xffe8,0xffe8,0,11), (0xffe9,0xffec,0,6), -(0xffed,0xffee,0,11), (0xfff9,0xfffb,0,13), (0xfffc,0xfffd,0,11), -(0x10000,0x1000b,47,19), (0x1000d,0x10026,47,19), (0x10028,0x1003a,47,19), -(0x1003c,0x1003d,47,19), (0x1003f,0x1004d,47,19), (0x10050,0x1005d,47,19), -(0x10080,0x100fa,47,19), (0x10100,0x10102,0,2), (0x10107,0x10133,0,14), -(0x10137,0x1013f,0,11), (0x10140,0x10174,2,22), (0x10175,0x10178,2,14), -(0x10179,0x10189,2,11), (0x1018a,0x1018a,2,14), (0x10190,0x1019b,0,11), -(0x101d0,0x101fc,0,11), (0x101fd,0x101fd,40,23), (0x10280,0x1029c,73,19), -(0x102a0,0x102d0,74,19), (0x10300,0x1031e,37,19), (0x10320,0x10323,37,14), -(0x10330,0x10340,38,19), (0x10341,0x10341,38,22), (0x10342,0x10349,38,19), -(0x1034a,0x1034a,38,22), (0x10380,0x1039d,48,19), (0x1039f,0x1039f,48,2), -(0x103a0,0x103c3,59,19), (0x103c8,0x103cf,59,19), (0x103d0,0x103d0,59,2), -(0x103d1,0x103d5,59,22), (0x10400,0x1044f,39,15), (0x10450,0x1047f,49,19), -(0x10480,0x1049d,50,19), (0x104a0,0x104a9,50,8), (0x10800,0x10805,51,19), -(0x10808,0x10808,51,19), (0x1080a,0x10835,51,19), (0x10837,0x10838,51,19), -(0x1083c,0x1083c,51,19), (0x1083f,0x1083f,51,19), (0x10840,0x10855,86,19), -(0x10857,0x10857,86,2), (0x10858,0x1085f,86,14), (0x10900,0x10915,63,19), -(0x10916,0x1091b,63,14), (0x1091f,0x1091f,63,2), (0x10920,0x10939,75,19), -(0x1093f,0x1093f,75,2), (0x10980,0x1099f,97,19), (0x109a0,0x109b7,96,19), -(0x109be,0x109bf,96,19), (0x10a00,0x10a00,60,19), (0x10a01,0x10a03,60,23), -(0x10a05,0x10a06,60,23), (0x10a0c,0x10a0f,60,23), (0x10a10,0x10a13,60,19), -(0x10a15,0x10a17,60,19), (0x10a19,0x10a33,60,19), (0x10a38,0x10a3a,60,23), -(0x10a3f,0x10a3f,60,23), (0x10a40,0x10a47,60,14), (0x10a50,0x10a58,60,2), -(0x10a60,0x10a7c,87,19), (0x10a7d,0x10a7e,87,14), (0x10a7f,0x10a7f,87,2), -(0x10b00,0x10b35,79,19), (0x10b39,0x10b3f,79,2), (0x10b40,0x10b55,88,19), -(0x10b58,0x10b5f,88,14), (0x10b60,0x10b72,89,19), (0x10b78,0x10b7f,89,14), -(0x10c00,0x10c48,90,19), (0x10e60,0x10e7e,6,14), (0x11000,0x11000,93,18), -(0x11001,0x11001,93,23), (0x11002,0x11002,93,18), (0x11003,0x11037,93,19), -(0x11038,0x11046,93,23), (0x11047,0x1104d,93,2), (0x11052,0x11065,93,14), -(0x11066,0x1106f,93,8), (0x11080,0x11081,91,23), (0x11082,0x11082,91,18), -(0x11083,0x110af,91,19), (0x110b0,0x110b2,91,18), (0x110b3,0x110b6,91,23), -(0x110b7,0x110b8,91,18), (0x110b9,0x110ba,91,23), (0x110bb,0x110bc,91,2), -(0x110bd,0x110bd,91,13), (0x110be,0x110c1,91,2), (0x110d0,0x110e8,100,19), -(0x110f0,0x110f9,100,8), (0x11100,0x11102,95,23), (0x11103,0x11126,95,19), -(0x11127,0x1112b,95,23), (0x1112c,0x1112c,95,18), (0x1112d,0x11134,95,23), -(0x11136,0x1113f,95,8), (0x11140,0x11143,95,2), (0x11180,0x11181,99,23), -(0x11182,0x11182,99,18), (0x11183,0x111b2,99,19), (0x111b3,0x111b5,99,18), -(0x111b6,0x111be,99,23), (0x111bf,0x111c0,99,18), (0x111c1,0x111c4,99,19), -(0x111c5,0x111c8,99,2), (0x111d0,0x111d9,99,8), (0x11680,0x116aa,101,19), -(0x116ab,0x116ab,101,23), (0x116ac,0x116ac,101,18), (0x116ad,0x116ad,101,23), -(0x116ae,0x116af,101,18), (0x116b0,0x116b5,101,23), (0x116b6,0x116b6,101,18), -(0x116b7,0x116b7,101,23), (0x116c0,0x116c9,101,8), (0x12000,0x1236e,62,19), -(0x12400,0x12462,62,22), (0x12470,0x12473,62,2), (0x13000,0x1342e,80,19), -(0x16800,0x16a38,83,19), (0x16f00,0x16f44,98,19), (0x16f50,0x16f50,98,19), -(0x16f51,0x16f7e,98,18), (0x16f8f,0x16f92,98,23), (0x16f93,0x16f9f,98,17), -(0x1b000,0x1b000,33,19), (0x1b001,0x1b001,32,19), (0x1d000,0x1d0f5,0,11), -(0x1d100,0x1d126,0,11), (0x1d129,0x1d164,0,11), (0x1d165,0x1d166,0,18), -(0x1d167,0x1d169,40,23), (0x1d16a,0x1d16c,0,11), (0x1d16d,0x1d172,0,18), -(0x1d173,0x1d17a,0,13), (0x1d17b,0x1d182,40,23), (0x1d183,0x1d184,0,11), -(0x1d185,0x1d18b,40,23), (0x1d18c,0x1d1a9,0,11), (0x1d1aa,0x1d1ad,40,23), -(0x1d1ae,0x1d1dd,0,11), (0x1d200,0x1d241,2,11), (0x1d242,0x1d244,2,23), -(0x1d245,0x1d245,2,11), (0x1d300,0x1d356,0,11), (0x1d360,0x1d371,0,14), -(0x1d400,0x1d454,0,15), (0x1d456,0x1d49c,0,15), (0x1d49e,0x1d49f,0,15), -(0x1d4a2,0x1d4a2,0,15), (0x1d4a5,0x1d4a6,0,15), (0x1d4a9,0x1d4ac,0,15), -(0x1d4ae,0x1d4b9,0,15), (0x1d4bb,0x1d4bb,0,15), (0x1d4bd,0x1d4c3,0,15), -(0x1d4c5,0x1d505,0,15), (0x1d507,0x1d50a,0,15), (0x1d50d,0x1d514,0,15), -(0x1d516,0x1d51c,0,15), (0x1d51e,0x1d539,0,15), (0x1d53b,0x1d53e,0,15), -(0x1d540,0x1d544,0,15), (0x1d546,0x1d546,0,15), (0x1d54a,0x1d550,0,15), -(0x1d552,0x1d6a5,0,15), (0x1d6a8,0x1d6c0,0,15), (0x1d6c1,0x1d6c1,0,6), -(0x1d6c2,0x1d6da,0,15), (0x1d6db,0x1d6db,0,6), (0x1d6dc,0x1d6fa,0,15), -(0x1d6fb,0x1d6fb,0,6), (0x1d6fc,0x1d714,0,15), (0x1d715,0x1d715,0,6), -(0x1d716,0x1d734,0,15), (0x1d735,0x1d735,0,6), (0x1d736,0x1d74e,0,15), -(0x1d74f,0x1d74f,0,6), (0x1d750,0x1d76e,0,15), (0x1d76f,0x1d76f,0,6), -(0x1d770,0x1d788,0,15), (0x1d789,0x1d789,0,6), (0x1d78a,0x1d7a8,0,15), -(0x1d7a9,0x1d7a9,0,6), (0x1d7aa,0x1d7c2,0,15), (0x1d7c3,0x1d7c3,0,6), -(0x1d7c4,0x1d7cb,0,15), (0x1d7ce,0x1d7ff,0,8), (0x1ee00,0x1ee03,6,19), -(0x1ee05,0x1ee1f,6,19), (0x1ee21,0x1ee22,6,19), (0x1ee24,0x1ee24,6,19), -(0x1ee27,0x1ee27,6,19), (0x1ee29,0x1ee32,6,19), (0x1ee34,0x1ee37,6,19), -(0x1ee39,0x1ee39,6,19), (0x1ee3b,0x1ee3b,6,19), (0x1ee42,0x1ee42,6,19), -(0x1ee47,0x1ee47,6,19), (0x1ee49,0x1ee49,6,19), (0x1ee4b,0x1ee4b,6,19), -(0x1ee4d,0x1ee4f,6,19), (0x1ee51,0x1ee52,6,19), (0x1ee54,0x1ee54,6,19), -(0x1ee57,0x1ee57,6,19), (0x1ee59,0x1ee59,6,19), (0x1ee5b,0x1ee5b,6,19), -(0x1ee5d,0x1ee5d,6,19), (0x1ee5f,0x1ee5f,6,19), (0x1ee61,0x1ee62,6,19), -(0x1ee64,0x1ee64,6,19), (0x1ee67,0x1ee6a,6,19), (0x1ee6c,0x1ee72,6,19), -(0x1ee74,0x1ee77,6,19), (0x1ee79,0x1ee7c,6,19), (0x1ee7e,0x1ee7e,6,19), -(0x1ee80,0x1ee89,6,19), (0x1ee8b,0x1ee9b,6,19), (0x1eea1,0x1eea3,6,19), -(0x1eea5,0x1eea9,6,19), (0x1eeab,0x1eebb,6,19), (0x1eef0,0x1eef1,6,6), -(0x1f000,0x1f02b,0,11), (0x1f030,0x1f093,0,11), (0x1f0a0,0x1f0ae,0,11), -(0x1f0b1,0x1f0be,0,11), (0x1f0c1,0x1f0cf,0,11), (0x1f0d1,0x1f0df,0,11), -(0x1f100,0x1f10a,0,14), (0x1f110,0x1f12e,0,11), (0x1f130,0x1f16b,0,11), -(0x1f170,0x1f19a,0,11), (0x1f1e6,0x1f1ff,0,11), (0x1f200,0x1f200,32,11), -(0x1f201,0x1f202,0,11), (0x1f210,0x1f23a,0,11), (0x1f240,0x1f248,0,11), -(0x1f250,0x1f251,0,11), (0x1f300,0x1f320,0,11), (0x1f330,0x1f335,0,11), -(0x1f337,0x1f37c,0,11), (0x1f380,0x1f393,0,11), (0x1f3a0,0x1f3c4,0,11), -(0x1f3c6,0x1f3ca,0,11), (0x1f3e0,0x1f3f0,0,11), (0x1f400,0x1f43e,0,11), -(0x1f440,0x1f440,0,11), (0x1f442,0x1f4f7,0,11), (0x1f4f9,0x1f4fc,0,11), -(0x1f500,0x1f53d,0,11), (0x1f540,0x1f543,0,11), (0x1f550,0x1f567,0,11), -(0x1f5fb,0x1f640,0,11), (0x1f645,0x1f64f,0,11), (0x1f680,0x1f6c5,0,11), -(0x1f700,0x1f773,0,11), (0x20000,0x2a6d6,35,19), (0x2a700,0x2b734,35,19), -(0x2b740,0x2b81d,35,19), (0x2f800,0x2fa1d,35,19), (0xe0001,0xe0001,0,13), -(0xe0020,0xe007f,0,13), (0xe0100,0xe01ef,40,23) -]} - -def script_cat(chr): - """ For the unicode character chr return a tuple (Scriptname, Category). """ - l = 0 - r = len(script_data['idx']) - 1 - c = ord(chr) - while r >= l: - m = (l + r) >> 1 - if c < script_data['idx'][m][0]: - r = m - 1 - elif c > script_data['idx'][m][1]: - l = m + 1 - else: - return ( - script_data['names'][script_data['idx'][m][2]], - script_data['cats'][script_data['idx'][m][3]]) - return 'Unknown', 'Zzzz' - -def script(chr): - a, _ = script_cat(chr) - return a - -def category(chr): - _, a = script_cat(chr) - return a - -def _compile_scripts_txt(): - # build indexes from 'scripts.txt' - - idx = [] - names = [] - cats = [] - - import urllib2, re, textwrap - - url = 'http://www.unicode.org/Public/UNIDATA/Scripts.txt' - f = urllib2.urlopen(url) - for ln in f: - p = re.findall(r'([0-9A-F]+)(?:\.\.([0-9A-F]+))?\W+(\w+)\s*#\s*(\w+)', ln) - if p: - a, b, name, cat = p[0] - if name not in names: - names.append(name) - if cat not in cats: - cats.append(cat) - idx.append((int(a, 16), int(b or a, 16), names.index(name), cats.index(cat))) - idx.sort() - - print('script_data = {\n"names":%s,\n"cats":%s,\n"idx":[\n%s\n]}' % ( - '\n'.join(textwrap.wrap(repr(names), 80)), - '\n'.join(textwrap.wrap(repr(cats), 80)), - '\n'.join(textwrap.wrap(', '.join('(0x%x,0x%x,%d,%d)' % c for c in idx), 80)))) diff --git a/legacy/lib/globals.py b/legacy/lib/globals.py deleted file mode 100644 index c3aaf99..0000000 --- a/legacy/lib/globals.py +++ /dev/null @@ -1,149 +0,0 @@ -""" -global configuration of the project - -External environment variables: - - WTTR_MYDIR - WTTR_GEOLITE - WTTR_WEGO - WTTR_LISTEN_HOST - WTTR_LISTEN_PORT - WTTR_USER_AGENT - -""" -from __future__ import print_function - -import logging -import os -import re - -MYDIR = os.path.abspath(os.path.dirname(os.path.dirname('__file__'))) - -if "WTTR_GEOLITE" in os.environ: - GEOLITE = os.environ["WTTR_GEOLITE"] -else: - GEOLITE = os.path.join(MYDIR, 'data', "GeoLite2-City.mmdb") - -WEGO = os.environ.get("WTTR_WEGO", "/home/igor/go/bin/we-lang") -PYPHOON = "pyphoon-lolcat" - -_DATADIR = "/wttr.in" -_LOGDIR = "/wttr.in/log" - -IP2LCACHE = os.path.join(_DATADIR, "cache/ip2l/") -PNG_CACHE = os.path.join(_DATADIR, "cache/png") -LRU_CACHE = os.path.join(_DATADIR, "cache/lru") - -LOG_FILE = os.path.join(_LOGDIR, 'main.log') - -ALIASES = os.path.join(MYDIR, "share/aliases") -ANSI2HTML = os.path.join(MYDIR, "share/ansi2html.sh") -BLACKLIST = os.path.join(MYDIR, "share/blacklist") - -HELP_FILE = os.path.join(MYDIR, 'share/help.txt') -BASH_FUNCTION_FILE = os.path.join(MYDIR, 'share/bash-function.txt') -TRANSLATION_FILE = os.path.join(MYDIR, 'share/translation.txt') - -IATA_CODES_FILE = os.path.join(MYDIR, 'share/list-of-iata-codes.txt') - -TEMPLATES = os.path.join(MYDIR, 'share/templates') -STATIC = os.path.join(MYDIR, 'share/static') - -NOT_FOUND_LOCATION = "not found" -DEFAULT_LOCATION = "oymyakon" - -MALFORMED_RESPONSE_HTML_PAGE = open(os.path.join(STATIC, 'malformed-response.html')).read() - -GEOLOCATOR_SERVICE = 'http://localhost:8004' - -# number of queries from the same IP address is limited -# (minute, hour, day) limitations: -QUERY_LIMITS = (300, 3600, 24*3600) - -LISTEN_HOST = os.environ.get("WTTR_LISTEN_HOST", "") -try: - LISTEN_PORT = int(os.environ.get("WTTR_LISTEN_PORT")) -except (TypeError, ValueError): - LISTEN_PORT = 8002 - -PROXY_HOST = "127.0.0.1" -PROXY_PORT = 5001 -PROXY_CACHEDIR = os.path.join(_DATADIR, "cache/proxy-wwo/") - -MY_EXTERNAL_IP = '5.9.243.187' - -PLAIN_TEXT_AGENTS = [ - "curl", - "httpie", - "lwp-request", - "wget", - "python-requests", - "openbsd ftp", - "powershell", -] - -PLAIN_TEXT_PAGES = [':help', ':bash.function', ':translation', ':iterm2'] - -_IPLOCATION_ORDER = os.environ.get( - "WTTR_IPLOCATION_ORDER", - 'geoip,ip2location,ipinfo') -IPLOCATION_ORDER = _IPLOCATION_ORDER.split(',') - -_IP2LOCATION_KEY_FILE = os.environ.get( - "WTTR_IP2LOCATION_KEY_FILE", - os.environ['HOME'] + '/.ip2location.key') -IP2LOCATION_KEY = None -if os.path.exists(_IP2LOCATION_KEY_FILE): - IP2LOCATION_KEY = open(_IP2LOCATION_KEY_FILE, 'r').read().strip() - -_IPINFO_KEY_FILE = os.environ.get( - "WTTR_IPINFO_KEY_FILE", - os.environ['HOME'] + '/.ipinfo.key') -IPINFO_TOKEN = None -if os.path.exists(_IPINFO_KEY_FILE): - IPINFO_TOKEN = open(_IPINFO_KEY_FILE, 'r').read().strip() - -_WWO_KEY_FILE = os.environ.get( - "WTTR_WWO_KEY_FILE", - os.environ['HOME'] + '/.wwo.key') -WWO_KEY = "key-is-not-specified" -USE_METNO = True -USER_AGENT = os.environ.get("WTTR_USER_AGENT", "") -if os.path.exists(_WWO_KEY_FILE): - WWO_KEY = open(_WWO_KEY_FILE, 'r').read().strip() - USE_METNO = False - -def error(text): - "log error `text` and raise a RuntimeError exception" - - if not text.startswith('Too many queries'): - print(text) - logging.error("ERROR %s", text) - raise RuntimeError(text) - -def log(text): - "log error `text` and do not raise any exceptions" - - if not text.startswith('Too many queries'): - print(text) - logging.info(text) - -def debug_log(text): - """ - Write `text` to the debug log - """ - - with open('/tmp/wttr.in-debug.log', 'a') as f_debug: - f_debug.write(text+'\n') - -def get_help_file(lang): - "Return help file for `lang`" - - help_file = os.path.join(MYDIR, 'share/translations/%s-help.txt' % lang) - if os.path.exists(help_file): - return help_file - return HELP_FILE - -def remove_ansi(sometext): - ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]') - return ansi_escape.sub('', sometext) diff --git a/legacy/lib/limits.py b/legacy/lib/limits.py deleted file mode 100644 index 2ff32e6..0000000 --- a/legacy/lib/limits.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -Connection limitation. - -Number of connections from one IP is limited. -We have nothing against scripting and automated queries. -Even the opposite, we encourage them. But there are some -connection limits that even we can't handle. -Currently the limits are quite restrictive, but they will be relaxed -in the future. - -Usage: - - limits = Limits() - not_allowed = limits.check_ip(ip_address) - if not_allowed: - return "ERROR: %s" % not_allowed - -[Taken from github.com/chubin/cheat.sh] -""" - -import time -from globals import log - -def _time_caps(minutes, hours, days): - return { - 'min': minutes, - 'hour': hours, - 'day': days, - } - -class Limits(object): - """ - Queries limitation (by IP). - - Exports: - - check_ip(ip_address) - """ - - def __init__(self, whitelist=None, limits=None): - self.intervals = ['min', 'hour', 'day'] - - self.divisor = _time_caps(60, 3600, 86400) - self.last_update = _time_caps(0, 0, 0) - - if limits: - self.limit = _time_caps(*limits) - else: - self.limit = _time_caps(30, 600, 1000) - - if whitelist: - self.whitelist = whitelist[:] - else: - self.whitelist = [] - - self.counter = { - 'min': {}, - 'hour': {}, - 'day': {}, - } - - self._clear_counters_if_needed() - - def _log_visit(self, interval, ip_address): - if ip_address not in self.counter[interval]: - self.counter[interval][ip_address] = 0 - self.counter[interval][ip_address] += 1 - - def _limit_exceeded(self, interval, ip_address): - visits = self.counter[interval][ip_address] - limit = self._get_limit(interval) - return visits > limit - - def _get_limit(self, interval): - return self.limit[interval] - - def _report_excessive_visits(self, interval, ip_address): - log("%s LIMITED [%s for %s]" % (ip_address, self._get_limit(interval), interval)) - - def check_ip(self, ip_address): - """ - Check if `ip_address` is allowed, and if not raise an RuntimeError exception. - Return True otherwise - """ - if ip_address in self.whitelist: - return None - self._clear_counters_if_needed() - for interval in self.intervals: - self._log_visit(interval, ip_address) - if self._limit_exceeded(interval, ip_address): - self._report_excessive_visits(interval, ip_address) - return ("Not so fast! Number of queries per %s is limited to %s" - % (interval, self._get_limit(interval))) - return None - - def reset(self): - """ - Reset all counters for all IPs - """ - for interval in self.intervals: - self.counter[interval] = {} - - def _clear_counters_if_needed(self): - current_time = int(time.time()) - for interval in self.intervals: - if current_time // self.divisor[interval] != self.last_update[interval]: - self.counter[interval] = {} - self.last_update[interval] = current_time / self.divisor[interval] diff --git a/legacy/lib/location.py b/legacy/lib/location.py deleted file mode 100644 index cff6d42..0000000 --- a/legacy/lib/location.py +++ /dev/null @@ -1,354 +0,0 @@ -""" -All location related functions and converters. - -The main entry point is `location_processing` -which gets `location` and `source_ip_address` -and basing on this information generates -precise location description. - -""" -from __future__ import print_function - -import sys -import os -import json -import socket -import requests -import geoip2.database - -from globals import GEOLITE, GEOLOCATOR_SERVICE, IP2LCACHE, IP2LOCATION_KEY, NOT_FOUND_LOCATION, \ - ALIASES, BLACKLIST, IATA_CODES_FILE, IPLOCATION_ORDER, IPINFO_TOKEN - -GEOIP_READER = geoip2.database.Reader(GEOLITE) - -def ascii_only(string): - "Check if `string` contains only ASCII symbols" - - try: - for _ in range(5): - string = string.encode('utf-8') - return True - except UnicodeDecodeError: - return False - -def is_ip(ip_addr): - """ - Check if `ip_addr` looks like an IP Address - """ - - if sys.version_info[0] < 3: - ip_addr = ip_addr.encode("utf-8") - - try: - socket.inet_pton(socket.AF_INET, ip_addr) - return True - except socket.error: - try: - socket.inet_pton(socket.AF_INET6, ip_addr) - return True - except socket.error: - return False - -def location_normalize(location): - """ - Normalize location name `location` - """ - #translation_table = dict.fromkeys(map(ord, '!@#$*;'), None) - def _remove_chars(chars, string): - return ''.join(x for x in string if x not in chars) - - location = location.lower().replace('_', ' ').replace('+', ' ').strip() - if not location.startswith('moon@'): - location = _remove_chars(r'!@#$*;:\\', location) - return location - - - -def geolocator(location): - """ - Return a GPS pair for specified `location` or None - if nothing can't be found - """ - - try: - geo = requests.get('%s/%s' % (GEOLOCATOR_SERVICE, location)).text - except requests.exceptions.ConnectionError as exception: - print("ERROR: %s" % exception) - return None - - if geo == "": - return None - - try: - answer = json.loads(geo.encode('utf-8')) - return answer - except ValueError as exception: - print("ERROR: %s" % exception) - return None - - return None - - -def ipcachewrite(ip_addr, location): - cached = os.path.join(IP2LCACHE, ip_addr) - if not os.path.exists(IP2LCACHE): - os.makedirs(IP2LCACHE) - with open(cached, 'w') as file: - file.write(location[0] + ';' + location[1]) - -def ipcache(ip_addr): - cached = os.path.join(IP2LCACHE, ip_addr) - if not os.path.exists(IP2LCACHE): - os.makedirs(IP2LCACHE) - - location = None - - if os.path.exists(cached): - location = open(cached, 'r').read().split(';') - if len(location) > 3: - return location[3], location[1] - elif len(location) > 1: - return location[0], location[1] - else: - return location[0], None - - return None, None - -def ip2location(ip_addr): - "Convert IP address `ip_addr` to a location name" - - location = ipcache(ip_addr) - if location: - return location - - # if IP2LOCATION_KEY is not set, do not the query, - # because the query wont be processed anyway - if IP2LOCATION_KEY: - try: - location = requests\ - .get('http://api.ip2location.com/?ip=%s&key=%s&package=WS3' \ - % (ip_addr, IP2LOCATION_KEY)).text - except requests.exceptions.ConnectionError: - pass - - if location and ';' in location: - ipcachewrite(ip_addr, location) - location = location.split(';')[3], location.split(';')[1] - else: - location = location, None - - return location - - -def ipinfo(ip_addr): - location = ipcache(ip_addr) - if location: - return location - if IPINFO_TOKEN: - r = requests.get('https://ipinfo.io/%s/json?token=%s' % - (ip_addr, IPINFO_TOKEN)) - if r.status_code == 200: - location = r.json()["city"], r.json()["country"] - if location: - ipcachewrite(ip_addr, location) - return location - - -def geoip(ip_addr): - try: - response = GEOIP_READER.city(ip_addr) - country = response.country.name - city = response.city.name - except geoip2.errors.AddressNotFoundError: - country = None - city = None - return city, country - -def workaround(city, country): - # workaround for the strange bug with the country name - # maybe some other countries has this problem too - # - # Having these in a separate function will help if this gets to - # be a problem - if country == 'Russian Federation': - country = 'Russia' - return city, country - -def get_location(ip_addr): - """ - Return location pair (CITY, COUNTRY) for `ip_addr` - """ - for method in IPLOCATION_ORDER: - if method == 'geoip': - city, country = geoip(ip_addr) - elif method == 'ip2location': - city, country = ip2location(ip_addr) - elif method == 'ipinfo': - city, country = ipinfo(ip_addr) - else: - print("ERROR: invalid iplocation method speficied: %s" % method) - if city is not None: - city, country = workaround(city, country) - return city, country - # - # temporary disabled it because of geoip services capcacity - # - #if city is None and response.location: - # coord = "%s, %s" % (response.location.latitude, response.location.longitude) - # try: - # location = geolocator.reverse(coord, language='en') - # city = location.raw.get('address', {}).get('city') - # except: - # pass - - # No methods resulted in a location - return default - return NOT_FOUND_LOCATION, None - - -def location_canonical_name(location): - "Find canonical name for `location`" - - location = location_normalize(location) - if location.lower() in LOCATION_ALIAS: - return LOCATION_ALIAS[location.lower()] - return location - -def load_aliases(aliases_filename): - """ - Load aliases from the aliases file - """ - aliases_db = {} - with open(aliases_filename, 'r') as f_aliases: - for line in f_aliases.readlines(): - try: - from_, to_ = line.decode('utf-8').split(':', 1) - except AttributeError: - from_, to_ = line.split(':', 1) - - aliases_db[location_normalize(from_)] = location_normalize(to_) - return aliases_db - -def load_iata_codes(iata_codes_filename): - """ - Load IATA codes from the IATA codes file - """ - with open(iata_codes_filename, 'r') as f_iata_codes: - result = [] - for line in f_iata_codes.readlines(): - result.append(line.strip()) - return set(result) - -LOCATION_ALIAS = load_aliases(ALIASES) -LOCATION_BLACK_LIST = [x.strip() for x in open(BLACKLIST, 'r').readlines()] -IATA_CODES = load_iata_codes(IATA_CODES_FILE) - -def is_location_blocked(location): - """ - Return True if this location is blocked - or False if it is allowed - """ - return location is not None and location.lower() in LOCATION_BLACK_LIST - - -def get_hemisphere(location): - """ - Return hemisphere of the location (True = North, False = South). - Assume North and return True if location can't be found. - """ - location_string = location[0] - if location[1] is not None: - location_string += ",%s" % location[1] - geolocation = geolocator(location_string) - if geolocation is None: - return True - return geolocation["latitude"] > 0 - -def location_processing(location, ip_addr): - """ - """ - - # if location is starting with ~ - # or has non ascii symbols - # it should be handled like a search term (for geolocator) - override_location_name = None - full_address = None - hide_full_address = False - force_show_full_address = location is not None and location.startswith('~') - - # location ~ means that it should be detected automatically, - # and shown in the location line below the report - if location == '~': - location = None - - if location and location.lstrip('~ ').startswith('@'): - try: - location, country = get_location( - socket.gethostbyname( - location.lstrip('~ ')[1:])) - location = '~' + location - if country: - location += ", %s" % country - hide_full_address = not force_show_full_address - except: - location, country = NOT_FOUND_LOCATION, None - - query_source_location = get_location(ip_addr) - - # For moon queries, hemisphere must be found - # True for North, False for South - hemisphere = False - if location is not None and (location.lower()+"@").startswith("moon@"): - hemisphere = get_hemisphere(query_source_location) - - country = None - if not location or location == 'MyLocation': - location = ip_addr - - if is_ip(location): - location, country = get_location(location) - - # here too - if location: - location = '~' + location - if country: - location += ", %s" % country - hide_full_address = not force_show_full_address - - if location and not location.startswith('~'): - tmp_location = location_canonical_name(location) - if tmp_location != location: - override_location_name = location - location = tmp_location - - # up to this point it is possible that the name - # contains some unicode symbols - # here we resolve them - if location is not None: # and not ascii_only(location): - location = "~" + location.lstrip('~ ') - if not override_location_name: - override_location_name = location.lstrip('~') - - # if location is not None and location.upper() in IATA_CODES: - # location = '~%s' % location - - if location is not None and not location.startswith("~-,") and location.startswith('~'): - geolocation = geolocator(location_canonical_name(location[1:])) - if geolocation is not None: - if not override_location_name: - override_location_name = location[1:].replace('+', ' ') - location = "%s,%s" % (geolocation['latitude'], geolocation['longitude']) - country = None - if not hide_full_address: - full_address = geolocation['address'] - else: - full_address = None - else: - location = NOT_FOUND_LOCATION #location[1:] - - - return location, \ - override_location_name, \ - full_address, \ - country, \ - query_source_location, \ - hemisphere diff --git a/legacy/lib/metno.py b/legacy/lib/metno.py deleted file mode 100755 index 18aae75..0000000 --- a/legacy/lib/metno.py +++ /dev/null @@ -1,462 +0,0 @@ -#!/bin/env python -# vim: fileencoding=utf-8 -from datetime import datetime, timedelta -import json -import logging -import os -import re -import sys - -import timezonefinder -from pytz import timezone - -from constants import WWO_CODE - -logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO")) -logger = logging.getLogger(__name__) - - -def metno_request(path, query_string): - # We'll need to sanitize the inbound request - ideally the - # premium/v1/weather.ashx portion would have always been here, though - # it seems as though the proxy was built after the majority of the app - # and not refactored. For WAPI we'll strip this and the API key out, - # then manage it on our own. - logger.debug('Original path: ' + path) - logger.debug('Original query: ' + query_string) - - path = path.replace('premium/v1/weather.ashx', - 'weatherapi/locationforecast/2.0/complete') - query_string = re.sub(r'key=[^&]*&', '', query_string) - query_string = re.sub(r'format=[^&]*&', '', query_string) - days = int(re.search(r'num_of_days=([0-9]+)&', query_string).group(1)) - query_string = re.sub(r'num_of_days=[0-9]+&', '', query_string) - # query_string = query_string.replace('key=', '?key=' + WAPI_KEY) - # TP is for hourly forecasting, which isn't available in the free api. - query_string = re.sub(r'tp=[0-9]*&', '', query_string) - # This assumes lang=... is at the end. Also note that the API doesn't - # localize, and we're not either. TODO: add language support - query_string = re.sub(r'lang=[^&]*$', '', query_string) - query_string = re.sub(r'&$', '', query_string) - - logger.debug('qs: ' + query_string) - # Deal with coordinates. Need to be rounded to 4 decimals for metno ToC - # and in a different query string format - coord_match = re.search(r'q=[^&]*', query_string) - coords_str = coord_match.group(0) - coords = re.findall(r'[-0-9.]+', coords_str) - lat = str(round(float(coords[0]), 4)) - lng = str(round(float(coords[1]), 4)) - logger.debug('lat: ' + lat) - logger.debug('lng: ' + lng) - query_string = re.sub(r'q=[^&]*', 'lat=' + lat + '&lon=' + lng + '&', - query_string) - logger.debug('Return path: ' + path) - logger.debug('Return query: ' + query_string) - - return path, query_string, days - - -def celsius_to_f(celsius): - return round((1.8 * celsius) + 32, 1) - - -def to_weather_code(symbol_code): - logger.debug(symbol_code) - code = re.sub(r'_.*', '', symbol_code) - logger.debug(code) - # symbol codes: https://api.met.no/weatherapi/weathericon/2.0/documentation - # they also have _day, _night and _polartwilight variants - # See json from https://api.met.no/weatherapi/weathericon/2.0/legends - # WWO codes: https://github.com/chubin/wttr.in/blob/master/lib/constants.py - # http://www.worldweatheronline.com/feed/wwoConditionCodes.txt - weather_code_map = { - "clearsky": 113, - "cloudy": 119, - "fair": 116, - "fog": 143, - "heavyrain": 302, - "heavyrainandthunder": 389, - "heavyrainshowers": 305, - "heavyrainshowersandthunder": 386, - "heavysleet": 314, # There's a ton of 'LightSleet' in WWO_CODE... - "heavysleetandthunder": 377, - "heavysleetshowers": 362, - "heavysleetshowersandthunder": 374, - "heavysnow": 230, - "heavysnowandthunder": 392, - "heavysnowshowers": 371, - "heavysnowshowersandthunder": 392, - "lightrain": 266, - "lightrainandthunder": 200, - "lightrainshowers": 176, - "lightrainshowersandthunder": 386, - "lightsleet": 281, - "lightsleetandthunder": 377, - "lightsleetshowers": 284, - "lightsnow": 320, - "lightsnowandthunder": 392, - "lightsnowshowers": 368, - "lightssleetshowersandthunder": 365, - "lightssnowshowersandthunder": 392, - "partlycloudy": 116, - "rain": 293, - "rainandthunder": 389, - "rainshowers": 299, - "rainshowersandthunder": 386, - "sleet": 185, - "sleetandthunder": 392, - "sleetshowers": 263, - "sleetshowersandthunder": 392, - "snow": 329, - "snowandthunder": 392, - "snowshowers": 230, - "snowshowersandthunder": 392, - } - if code not in weather_code_map: - logger.debug('not found') - return -1 # not found - logger.debug(weather_code_map[code]) - return weather_code_map[code] - - -def to_description(symbol_code): - desc = WWO_CODE[str(to_weather_code(symbol_code))] - logger.debug(desc) - return desc - - -def to_16_point(degrees): - # 360 degrees / 16 = 22.5 degrees of arc or 11.25 degrees around the point - if degrees > (360 - 11.25) or degrees <= 11.25: - return 'N' - if degrees > 11.25 and degrees <= (11.25 + 22.5): - return 'NNE' - if degrees > (11.25 + (22.5 * 1)) and degrees <= (11.25 + (22.5 * 2)): - return 'NE' - if degrees > (11.25 + (22.5 * 2)) and degrees <= (11.25 + (22.5 * 3)): - return 'ENE' - if degrees > (11.25 + (22.5 * 3)) and degrees <= (11.25 + (22.5 * 4)): - return 'E' - if degrees > (11.25 + (22.5 * 4)) and degrees <= (11.25 + (22.5 * 5)): - return 'ESE' - if degrees > (11.25 + (22.5 * 5)) and degrees <= (11.25 + (22.5 * 6)): - return 'SE' - if degrees > (11.25 + (22.5 * 6)) and degrees <= (11.25 + (22.5 * 7)): - return 'SSE' - if degrees > (11.25 + (22.5 * 7)) and degrees <= (11.25 + (22.5 * 8)): - return 'S' - if degrees > (11.25 + (22.5 * 8)) and degrees <= (11.25 + (22.5 * 9)): - return 'SSW' - if degrees > (11.25 + (22.5 * 9)) and degrees <= (11.25 + (22.5 * 10)): - return 'SW' - if degrees > (11.25 + (22.5 * 10)) and degrees <= (11.25 + (22.5 * 11)): - return 'WSW' - if degrees > (11.25 + (22.5 * 11)) and degrees <= (11.25 + (22.5 * 12)): - return 'W' - if degrees > (11.25 + (22.5 * 12)) and degrees <= (11.25 + (22.5 * 13)): - return 'WNW' - if degrees > (11.25 + (22.5 * 13)) and degrees <= (11.25 + (22.5 * 14)): - return 'NW' - if degrees > (11.25 + (22.5 * 14)) and degrees <= (11.25 + (22.5 * 15)): - return 'NNW' - - -def meters_to_miles(meters): - return round(meters * 0.00062137, 2) - - -def mm_to_inches(mm): - return round(mm / 25.4, 2) - - -def hpa_to_mb(hpa): - return hpa - - -def hpa_to_in(hpa): - return round(hpa * 0.02953, 2) - - -def group_hours_to_days(lat, lng, hourlies, days_to_return): - tf = timezonefinder.TimezoneFinder() - timezone_str = tf.certain_timezone_at(lat=lat, lng=lng) - logger.debug('got TZ: ' + timezone_str) - tz = timezone(timezone_str) - start_day_gmt = datetime.fromisoformat(hourlies[0]['time'] - .replace('Z', '+00:00')) - start_day_local = start_day_gmt.astimezone(tz) - end_day_local = (start_day_local + timedelta(days=days_to_return - 1)).date() - logger.debug('series starts at gmt time: ' + str(start_day_gmt)) - logger.debug('series starts at local time: ' + str(start_day_local)) - logger.debug('series ends on day: ' + str(end_day_local)) - days = {} - - for hour in hourlies: - current_day_gmt = datetime.fromisoformat(hour['time'] - .replace('Z', '+00:00')) - current_local = current_day_gmt.astimezone(tz) - current_day_local = current_local.date() - if current_day_local > end_day_local: - continue - if current_day_local not in days: - days[current_day_local] = {'hourly': []} - hour['localtime'] = current_local.time() - days[current_day_local]['hourly'].append(hour) - - # Need a second pass to build the min/max/avg data - for date, day in days.items(): - minTempC = -999 - maxTempC = 1000 - avgTempC = None - n = 0 - maxUvIndex = 0 - for hour in day['hourly']: - temp = hour['data']['instant']['details']['air_temperature'] - if temp > minTempC: - minTempC = temp - if temp < maxTempC: - maxTempC = temp - if avgTempC is None: - avgTempC = temp - n = 1 - else: - avgTempC = ((avgTempC * n) + temp) / (n + 1) - n = n + 1 - - uv = hour['data']['instant']['details'] - if 'ultraviolet_index_clear_sky' in uv: - if uv['ultraviolet_index_clear_sky'] > maxUvIndex: - maxUvIndex = uv['ultraviolet_index_clear_sky'] - day["maxtempC"] = str(maxTempC) - day["maxtempF"] = str(celsius_to_f(maxTempC)) - day["mintempC"] = str(minTempC) - day["mintempF"] = str(celsius_to_f(minTempC)) - day["avgtempC"] = str(round(avgTempC, 1)) - day["avgtempF"] = str(celsius_to_f(avgTempC)) - # day["totalSnow_cm": "not implemented", - # day["sunHour": "12", # This would come from astonomy data - day["uvIndex"] = str(maxUvIndex) - - return days - -def _convert_hour(hour): - # Whatever is upstream is expecting data in the shape of WWO. This method will - # morph from metno to hourly WWO response format. - # Note that WWO is providing data every 3 hours. Metno provides every hour - # { - # "time": "0", - # "tempC": "19", - # "tempF": "66", - # "windspeedMiles": "6", - # "windspeedKmph": "9", - # "winddirDegree": "276", - # "winddir16Point": "W", - # "weatherCode": "119", - # "weatherIconUrl": [ - # { - # "value": "http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0003_white_cloud.png" - # } - # ], - # "weatherDesc": [ - # { - # "value": "Cloudy" - # } - # ], - # "precipMM": "0.0", - # "precipInches": "0.0", - # "humidity": "62", - # "visibility": "10", - # "visibilityMiles": "6", - # "pressure": "1017", - # "pressureInches": "31", - # "cloudcover": "66", - # "HeatIndexC": "19", - # "HeatIndexF": "66", - # "DewPointC": "12", - # "DewPointF": "53", - # "WindChillC": "19", - # "WindChillF": "66", - # "WindGustMiles": "8", - # "WindGustKmph": "13", - # "FeelsLikeC": "19", - # "FeelsLikeF": "66", - # "chanceofrain": "0", - # "chanceofremdry": "93", - # "chanceofwindy": "0", - # "chanceofovercast": "89", - # "chanceofsunshine": "18", - # "chanceoffrost": "0", - # "chanceofhightemp": "0", - # "chanceoffog": "0", - # "chanceofsnow": "0", - # "chanceofthunder": "0", - # "uvIndex": "1" - details = hour['data']['instant']['details'] - if 'next_1_hours' in hour['data']: - next_hour = hour['data']['next_1_hours'] - elif 'next_6_hours' in hour['data']: - next_hour = hour['data']['next_6_hours'] - elif 'next_12_hours' in hour['data']: - next_hour = hour['data']['next_12_hours'] - else: - next_hour = {} - - # Need to dig out symbol_code and precipitation_amount - symbol_code = 'clearsky_day' # Default to sunny - if 'summary' in next_hour and 'symbol_code' in next_hour['summary']: - symbol_code = next_hour['summary']['symbol_code'] - precipitation_amount = 0 # Default to no rain - if 'details' in next_hour and 'precipitation_amount' in next_hour['details']: - precipitation_amount = next_hour['details']['precipitation_amount'] - - uvIndex = 0 # default to 0 index - if 'ultraviolet_index_clear_sky' in details: - uvIndex = details['ultraviolet_index_clear_sky'] - localtime = '' - if 'localtime' in hour: - localtime = "{h:02.0f}".format(h=hour['localtime'].hour) + \ - "{m:02.0f}".format(m=hour['localtime'].minute) - logger.debug(str(hour['localtime'])) - # time property is local time, 4 digit 24 hour, with no :, e.g. 2100 - return { - 'time': localtime, - 'observation_time': hour['time'], # Need to figure out WWO TZ - # temp_C is used in we-lang.go calcs in such a way - # as to expect a whole number - 'temp_C': str(int(round(details['air_temperature'], 0))), - # temp_F can be more precise - not used in we-lang.go calcs - 'temp_F': str(celsius_to_f(details['air_temperature'])), - 'weatherCode': str(to_weather_code(symbol_code)), - 'weatherIconUrl': [{ - 'value': 'not yet implemented', - }], - 'weatherDesc': [{ - 'value': to_description(symbol_code), - }], - # similiarly, windspeedMiles is not used by we-lang.go, but kmph is - "windspeedMiles": str(meters_to_miles(details['wind_speed'])), - "windspeedKmph": str(int(round(details['wind_speed'], 0))), - "winddirDegree": str(details['wind_from_direction']), - "winddir16Point": to_16_point(details['wind_from_direction']), - "precipMM": str(precipitation_amount), - "precipInches": str(mm_to_inches(precipitation_amount)), - "humidity": str(details['relative_humidity']), - "visibility": 'not yet implemented', # str(details['vis_km']), - "visibilityMiles": 'not yet implemented', # str(details['vis_miles']), - "pressure": str(hpa_to_mb(details['air_pressure_at_sea_level'])), - "pressureInches": str(hpa_to_in(details['air_pressure_at_sea_level'])), - "cloudcover": 'not yet implemented', # Convert from cloud_area_fraction?? str(details['cloud']), - # metno doesn't have FeelsLikeC, but we-lang.go is using it in calcs, - # so we shall set it to temp_C - "FeelsLikeC": str(int(round(details['air_temperature'], 0))), - "FeelsLikeF": 'not yet implemented', # str(details['feelslike_f']), - "uvIndex": str(uvIndex), - } - - -def _convert_hourly(hours): - converted_hours = [] - for hour in hours: - converted_hours.append(_convert_hour(hour)) - return converted_hours - - -# Whatever is upstream is expecting data in the shape of WWO. This method will -# morph from metno to WWO response format. -def create_standard_json_from_metno(content, days_to_return): - try: - forecast = json.loads(content) # pylint: disable=invalid-name - except (ValueError, TypeError) as exception: - logger.error("---") - logger.error(exception) - logger.error("---") - return {}, '' - hourlies = forecast['properties']['timeseries'] - current = hourlies[0] - # We are assuming these units: - # "units": { - # "air_pressure_at_sea_level": "hPa", - # "air_temperature": "celsius", - # "air_temperature_max": "celsius", - # "air_temperature_min": "celsius", - # "cloud_area_fraction": "%", - # "cloud_area_fraction_high": "%", - # "cloud_area_fraction_low": "%", - # "cloud_area_fraction_medium": "%", - # "dew_point_temperature": "celsius", - # "fog_area_fraction": "%", - # "precipitation_amount": "mm", - # "relative_humidity": "%", - # "ultraviolet_index_clear_sky": "1", - # "wind_from_direction": "degrees", - # "wind_speed": "m/s" - # } - content = { - 'data': { - 'request': [{ - 'type': 'feature', - 'query': str(forecast['geometry']['coordinates'][1]) + ',' + - str(forecast['geometry']['coordinates'][0]) - }], - 'current_condition': [ - _convert_hour(current) - ], - 'weather': [] - } - } - - days = group_hours_to_days(forecast['geometry']['coordinates'][1], - forecast['geometry']['coordinates'][0], - hourlies, days_to_return) - - # TODO: Astronomy needs to come from this: - # https://api.met.no/weatherapi/sunrise/2.0/.json?lat=40.7127&lon=-74.0059&date=2020-10-07&offset=-05:00 - # and obviously can be cached for a while - # https://api.met.no/weatherapi/sunrise/2.0/documentation - # Note that full moon/new moon/first quarter/last quarter aren't returned - # and the moonphase value should match these from WWO: - # New Moon - # Waxing Crescent - # First Quarter - # Waxing Gibbous - # Full Moon - # Waning Gibbous - # Last Quarter - # Waning Crescent - - for date, day in days.items(): - content['data']['weather'].append({ - "date": str(date), - "astronomy": [], - "maxtempC": day['maxtempC'], - "maxtempF": day['maxtempF'], - "mintempC": day['mintempC'], - "mintempF": day['mintempF'], - "avgtempC": day['avgtempC'], - "avgtempF": day['avgtempF'], - "totalSnow_cm": "not implemented", - "sunHour": "12", # This would come from astonomy data - "uvIndex": day['uvIndex'], - 'hourly': _convert_hourly(day['hourly']), - }) - - # for day in forecast. - return json.dumps(content) - - -if __name__ == "__main__": - # if len(sys.argv) == 1: - # for deg in range(0, 360): - # print('deg: ' + str(deg) + '; 16point: ' + to_16_point(deg)) - if len(sys.argv) == 2: - req = sys.argv[1].split('?') - # to_description(sys.argv[1]) - metno_request(req[0], req[1]) - elif len(sys.argv) == 3: - with open(sys.argv[1], 'r') as contentf: - content = create_standard_json_from_metno(contentf.read(), - int(sys.argv[2])) - print(content) - else: - print('usage: metno ') diff --git a/legacy/lib/parse_query.py b/legacy/lib/parse_query.py deleted file mode 100644 index 6c45e56..0000000 --- a/legacy/lib/parse_query.py +++ /dev/null @@ -1,172 +0,0 @@ -import re -import json -import zlib -import base64 - -def serialize(parsed_query): - return base64.b64encode( - zlib.compress( - json.dumps(parsed_query).encode("utf-8")), - altchars=b"-_").decode("utf-8") - -def deserialize(url): - - string = url[2:] - - extension = None - if "." in string: - string, extension = string.split(".", 1) - - try: - result = json.loads( - zlib.decompress( - base64.b64decode(string, altchars=b"-_")).decode("utf-8")) - except zlib.error: - return None - - if extension == "png": - result["png_filename"] = url - result["html_output"] = False - - return result - - -def metric_or_imperial(query, lang, us_ip=False): - """ - """ - - # what units should be used - # metric or imperial - # based on query and location source (imperial for US by default) - if query.get('use_metric', False) and not query.get('use_imperial', False): - query['use_imperial'] = False - query['use_metric'] = True - elif query.get('use_imperial', False) and not query.get('use_metric', False): - query['use_imperial'] = True - query['use_metric'] = False - elif lang == 'us': - # slack uses m by default, to override it speciy us.wttr.in - query['use_imperial'] = True - query['use_metric'] = False - else: - if us_ip: - query['use_imperial'] = True - query['use_metric'] = False - else: - query['use_imperial'] = False - query['use_metric'] = True - - return query - -def parse_query(args): - result = {} - - reserved_args = ["lang"] - - q = "" - - for key, val in args.items(): - if len(val) == 0: - q += key - continue - if val == 'True': - val = True - if val == 'False': - val = False - result[key] = val - - if q is None: - return result - if 'A' in q: - result['force-ansi'] = True - if 'n' in q: - result['narrow'] = True - if 'm' in q: - result['use_metric'] = True - if 'M' in q: - result['use_ms_for_wind'] = True - if 'u' in q: - result['use_imperial'] = True - if 'I' in q: - result['inverted_colors'] = True - if 't' in q: - result['transparency'] = '150' - if 'T' in q: - result['no-terminal'] = True - if 'p' in q: - result['padding'] = True - - for days in "0123": - if days in q: - result['days'] = days - - if 'q' in q: - result['no-caption'] = True - if 'Q' in q: - result['no-city'] = True - if 'F' in q: - result['no-follow-line'] = True - - for key, val in args.items(): - if val == 'True': - val = True - if val == 'False': - val = False - if val: - result[key] = val - - # currently `view` is alias for `format` - if "format" in result and not result.get("view"): - result["view"] = result["format"] - del result["format"] - - return result - -def parse_wttrin_png_name(name): - """ - Parse the PNG filename and return the result as a dictionary. - For example: - input = City_200x_lang=ru.png - output = { - "lang": "ru", - "width": "200", - "filetype": "png", - "location": "City" - } - """ - - parsed = {} - to_be_parsed = {} - - if name.lower()[-4:] == '.png': - parsed['filetype'] = 'png' - name = name[:-4] - - parts = name.split('_') - parsed['location'] = parts[0] - - one_letter_options = "" - for part in parts[1:]: - if re.match('(?:[0-9]+)x', part): - parsed['width'] = part[:-1] - elif re.match('x(?:[0-9]+)', part): - parsed['height'] = part[1:] - elif re.match(part, '(?:[0-9]+)x(?:[0-9]+)'): - parsed['width'], parsed['height'] = part.split('x', 1) - elif '=' in part: - arg, val = part.split('=', 1) - to_be_parsed[arg] = val - else: - one_letter_options += part - - for letter in one_letter_options: - to_be_parsed[letter] = '' - - parsed.update(parse_query(to_be_parsed)) - - # currently `view` is alias for `format` - if "format" in parsed and not parsed.get("view"): - parsed["view"] = parsed["format"] - del parsed["format"] - - return parsed diff --git a/legacy/lib/translations.py b/legacy/lib/translations.py deleted file mode 100644 index fd55e04..0000000 --- a/legacy/lib/translations.py +++ /dev/null @@ -1,851 +0,0 @@ -# vim: fileencoding=utf-8 - -""" -Translation of almost everything. -""" - -FULL_TRANSLATION = [ - "ar", "af", "be", "ca", "da", "de", "el", "et", - "fr", "fa", "hi", "hu", "ia", "id", "it", - "nb", "nl", "oc", "pl", "pt-br", "ro", - "ru", "tr", "th", "uk", "vi", "zh-cn", "zh-tw" -] - -PARTIAL_TRANSLATION = [ - "az", "bg", "bs", "cy", "cs", - "eo", "es", "eu", "fi", "ga", "hi", "hr", - "hy", "is", "ja", "jv", "ka", "kk", - "ko", "ky", "lt", "lv", "mk", "ml", "nl", "fy", - "nn", "pt", "pt-br", "sk", "sl", "sr", "sr-lat", - "sv", "sw", "te", "uz", - "zh", "zu", "he", -] - -PROXY_LANGS = [ - "af", "ar", "az", "be", "bs", "ca", - "cy", "de", "el", "eo", "et", "eu", "fa", "fr", - "fy", "ga", "he", "hr", "hu", "hy", - "ia", "id", "is", "it", "ja", "kk", - "lv", "mk", "nb", "nn", "oc", "ro", - "ru", "sl", "th", "pt-br", "uk", "uz", - "vi", "zh-cn", "zh-tw", -] - -SUPPORTED_LANGS = FULL_TRANSLATION + PARTIAL_TRANSLATION - - -MESSAGE = { - 'NOT_FOUND_MESSAGE': { - 'en': u""" -We were unable to find your location -so we have brought you to Oymyakon, -one of the coldest permanently inhabited locales on the planet. -""", - 'af': u""" -Ons kon nie u ligging opspoor nie -gevolglik het ons vir u na Oymyakon geneem, -een van die koudste permanent bewoonde plekke op aarde. -""", - 'ar': u""" -تعذر علينا العثور على موقعك -لذلك قمنا بجلبك إلي أويمياكون, - إحدى الأماكن المَأْهُولة الأكثر برودة علي الإطلاق في هذا الكوكب. -""", - 'be': u""" -Ваша месцазнаходжанне вызначыць не атрымалася, -таму мы пакажам вам надвор'е ў Аймяконе, -самым халодным населеным пункце на планеце. -Будзем спадзявацца, што ў вас сёння надвор'е лепей! -""", - 'bg':u""" -Не успяхме да открием вашето местоположение -така че ви доведохме в Оймякон, -едно от най-студените постоянно обитавани места на планетата. -""", - 'bs': u""" -Nismo mogli pronaći vašu lokaciju, -tako da smo te doveli do Oymyakon, -jedan od najhladnijih stalno naseljena mjesta na planeti. -Nadamo se da ćete imati bolje vreme! -""", - 'ca': u""" -Hem estat incapaços de trobar la seva ubicació, -per això l'hem portat fins Oymyakon, -un dels llocs més freds i permanentment deshabitats del planeta. -""", - 'cs': u""" -Nepodařilo se nám najít vaši polohu, -takže jsme vás přivedl do Ojmjakonu. -Je to jedno z nejchladnějších trvale obydlených míst na planetě. -Doufáme, že budete mít lepší počasí! -""", - 'cy': u""" -Ni darganfyddwyd eich lleoliad, -felly rydym wedi dod â chi i Oymyakon, -un o'r llefydd oeraf ar y blaned ble mae pobl yn dal i fyw! -""", - 'de': u""" -Wir konnten Ihren Standort nicht finden, -also haben wir Sie nach Oimjakon gebracht, -einer der kältesten dauerhaft bewohnten Orte auf dem Planeten. -Wir hoffen, dass Sie besseres Wetter haben! -""", - 'el': u""" -Δεν μπορέσαμε να βρούμε την τοποθεσία σου, -για αυτό διαλέξαμε το Οϊμιάκον για εσένα, -μία από τις πιο κρύες μόνιμα κατοικημένες περιοχές στον πλανήτη. -Ελπίζουμε να έχεις καλύτερο καιρό! -""", - 'es': u""" -No hemos logrado encontrar tu ubicación, -asi que hemos decidido enseñarte el tiempo en Oymyakon, -uno de los sitios más fríos y permanentemente deshabitados del planeta. -""", - 'eu': u""" -Ezin izan dugu zure kokapena aurkitu, -beraz eguraldia Oymyakonen erakustea erabaki dugu, -munduko lekurik hotz eta hutseneraiko bat -""", - 'fa': u""" -ما نتونستیم مکان شما رو پیدا کنیم. به همین خاطر شما رو به اویمیاکن بردیم -، یکی از سردترین مکان های روی زمین که اصلا قابل سکونت نیست! -""", - 'fi': u""" -Emme löytänyt sijaintiasi, joten toimme sinut Oimjakoniin, -yhteen maailman kylmimmistä pysyvästi asutetuista paikoista. -Toivottavasti sinulla on parempi sää! -""", - 'fr': u""" -Nous n'avons pas pu déterminer votre position, -Nous vous avons donc amenés à Oïmiakon, -l'un des endroits les plus froids habités en permanence sur la planète. -Nous espérons qu'il fait meilleur chez vous ! -""", - 'ga': u""" -Ní rabhamar ábalta do cheantar a aimsiú -mar sin thugamar go dtí Oymyakon, -tú ceann do na ceantair bhuanáitrithe is fuaire ar domhan. -""", - 'hi': u""" -हम आपका स्थान खोजने में असमर्थ है, -इसलिए हम आपको ओयमयाकोन पर ले आए है, -जो ग्रह के सबसे ठंडे स्थानों में से एक है| -""", - 'hu': u""" -Nem sikerült megtalálni a pozíciódat, -így elhoztunk Ojmjakonba; -az egyik leghidegebb állandóan lakott településre a bolygón. -""", - 'hy': u""" -Ձեր գտնվելու վայրը չհաջողվեց որոշել, -այդ պատճառով մենք ձեզ կցուցադրենք եղանակը Օյմյակոնում. -երկրագնդի ամենասառը բնակավայրում։ -Հույս ունենք որ ձեր եղանակը այսօր ավելի լավն է։ -""", - 'ia': u""" -Nos non trovate su location, -assi nos su apporte a Oymyakon, -un del plus frigide locos habita super le planeta! -""", - 'id': u""" -Kami tidak dapat menemukan lokasi anda, -jadi kami membawa anda ke Oymyakon, -salah satu tempat terdingin yang selalu dihuni di planet ini! -""", - 'is': u""" -Við finnum ekki staðsetninguna þína og vísum þér þar með á Ojmjakon, -ein af köldustu byggðum jarðar. -Vonandi er betra veður hjá þér. -""", - 'it': u""" -Non siamo riusciti a trovare la sua posizione -quindi la abbiamo portato a Oymyakon, -uno dei luoghi abitualmente abitati più freddi del pianeta. -Ci auguriamo che le condizioni dove lei si trova siano migliori! -""", - 'ja': u""" -指定された場所が見つかりませんでした。 -代わりにオイミャコンの天気予報を表示しています。 -オイミャコンは地球上で最も寒い居住地の一つです。 -""", - 'ko': u""" -지정된 장소를 찾을 수 없습니다, -대신 오이먀콘의 일기 예보를 표시합니다, -오이먀콘은 지구상에서 가장 추운 곳에 위치한 마을입니다! -""", - 'lv': u""" -Mēs nevarējām atrast jūsu atrašanās vietu tādēļ nogādājām jūs Oimjakonā, -vienā no aukstākajām apdzīvotajām vietām uz planētas. -""", - 'mk': u""" -Неможевме да ја пронајдеме вашата локација, -затоа ве однесовме во Ојмајкон, -еден од најладните трајно населени места на планетата. -""", - 'nb': u""" -Vi kunne ikke finne din lokasjon, -så her får du Ojmjakon, et av de kaldeste bebodde stedene på planeten. -Vi håper været er bedre hos deg! -""", - 'nl': u""" -Wij konden uw locatie niet vaststellen -dus hebben we u naar Ojmjakon gebracht, -één van de koudste permanent bewoonde gebieden op deze planeet. -""", - 'fy': u""" -Wy koenen jo lokaasje net fêststelle -dus wy ha jo nei Ojmjakon brocht, -ien fan de kâldste permanent bewenbere plakken op ierde. -""", - 'oc': u""" -Avèm pas pogut determinar vòstra posicion, -Vos avèm doncas menat a Oïmiakon, -un dels endreches mai freds abitat permanéncia del monde. -Esperam que fa melhor en çò vòstre ! -""", - 'pt': u""" -Não conseguimos encontrar a sua localização, -então decidimos te mostrar o tempo em Oymyakon, -um dos lugares mais frios e permanentemente desabitados do planeta. -""", - 'pt-br': u""" -Não conseguimos encontrar a sua localização, -então decidimos te mostrar o tempo em Oymyakon, -um dos lugares mais frios e permanentemente desabitados do planeta. -""", - 'pl': u""" -Nie udało nam się znaleźć podanej przez Ciebie lokalizacji, -więc zabraliśmy Cię do Ojmiakonu, -jednego z najzimniejszych, stale zamieszkanych miejsc na Ziemi. -Mamy nadzieję, że u Ciebie jest cieplej! -""", - 'ro': u""" -Nu v-am putut identifica localitatea, prin urmare vă arătăm vremea din Oimiakon, -una dintre cele mai reci localități permanent locuite de pe planetă. -Sperăm că aveți vreme mai bună! -""", - 'ru': u""" -Ваше местоположение определить не удалось, -поэтому мы покажем вам погоду в Оймяконе, -самом холодном населённом пункте на планете. -Будем надеяться, что у вас сегодня погода лучше! -""", - 'sk': u""" -Nepodarilo sa nám nájsť vašu polohu, -takže sme vás priviedli do Ojmiakonu. -Je to jedno z najchladnejších trvale obývaných miest na planéte. -Dúfame, že budete mať lepšie počasie! -""", - 'sr': u""" -Нисмо успели да пронађемо Вашу локацију, -па смо Вас довели у Ојмјакон, -једно од најхладнијих стално насељених места на планети. -Надамо се да је време код Вас боље него што је то случај овде! -""", - 'sv': u""" -Vi lyckades inte hitta er plats så vi har istället tagit er till Ojmjakon, -en av planetens kallaste platser med permanent bosättning. -Vi hoppas att vädret är bättre hos dig! -""", - 'tr': u""" -Aradığınız konum bulunamadı. O yüzden sizi dünyadaki en soğuk sürekli -yerleşim yerlerinden biri olan Oymyakon'e getirdik. -Umarız sizin olduğunuz yerde havalar daha iyidir! -""", - 'te': u""" -మేము మీ స్థానాన్ని కనుగొనలేకపోయాము -కనుక మనం "ఓమాయకాన్కు" తీసుకొని వచ్చాము, -భూమిపై అత్యల్ప శాశ్వతంగా నివసించే స్థానిక ప్రదేశాలలో ఒకటి. -""", - 'th': u""" -เราไม่สามารถหาตำแหน่งของคุณได้เราจึงนำคุณไปสู่ Oymyakon หมู่บ้านที่หนาวที่สุดในโลก! -""", - 'uk': u""" -Ми не змогли визначити Ваше місцезнаходження, -тому покажемо Вам погоду в Оймяконі — -найхолоднішому населеному пункті на планеті. -Будемо сподіватися, що у Вас сьогодні погода краще! -""", - 'uz': u""" -Sizning joylashuvingizni aniqlay olmadik, -shuning uchun sizga sayyoramizning eng sovuq aholi punkti - Oymyakondagi ob-havo haqida ma'lumot beramiz. -Umid qilamizki, sizda bugungi ob-havo bundan yaxshiroq! -""", - 'zh': u""" -我们无法找到您的位置, -当前显示奥伊米亚康(Oymyakon),这个星球上最冷的人类定居点。 -""", - 'da': u""" -Vi kunne desværre ikke finde din lokation -så vi har bragt dig til Oymyakon, -En af koldeste og helt ubolige lokationer på planeten. -""", - 'et': u""" -Me ei suutnud tuvastada teie asukohta -ning seetõttu paigutasime teid Oymyakoni, -mis on üks kõige külmemaid püsivalt asustatud paiku planeedil. -""", - 'vi': u""" -Chúng tôi không tìm thấy địa điểm của bạn -vì vậy chúng tôi đưa bạn đến Oymyakon, -một trong những nơi lạnh nhất có người sinh sống trên trái đất. -""", - 'zh-tw': u""" -我們找不到您的位置 -所以我們帶您到奧伊米亞康, -這個星球上有人類定居最冷之處。 -""", - }, - - 'UNKNOWN_LOCATION': { - 'en': u'Unknown location', - 'af': u'Onbekende ligging', - 'ar': u'موقع غير معروف', - 'be': u'Невядомае месцазнаходжанне', - 'bg': u'Неизвестно местоположение', - 'bs': u'Nepoznatoja lokacija', - 'ca': u'Ubicació desconeguda', - 'cs': u'Neznámá poloha', - 'cy': u'Lleoliad anhysbys', - 'de': u'Unbekannter Ort', - 'da': u'Ukendt lokation', - 'el': u'Άνγωστη τοποθεσία', - 'es': u'Ubicación desconocida', - 'et': u'Tundmatu asukoht', - 'eu': u'Kokapen ezezaguna', - 'fa': u'مکان نامعلوم', - 'fi': u'Tuntematon sijainti', - 'fr': u'Emplacement inconnu', - 'ga': u'Ceantar anaithnid', - 'hi': u'अज्ञात स्थान', - 'hu': u'Ismeretlen lokáció', - 'hy': u'Անհայտ գտնվելու վայր', - 'id': u'Lokasi tidak diketahui', - 'ia': u'Location incognite', - 'is': u'Óþekkt staðsetning', - 'it': u'Località sconosciuta', - 'ja': u'未知の場所です', - 'ko': u'알 수 없는 장소', - 'kk': u'', - 'lv': u'Nezināma atrašanās vieta', - 'mk': u'Непозната локација', - 'nb': u'Ukjent sted', - 'nl': u'Onbekende locatie', - 'oc': u'Emplaçament desconegut', - 'fy': u'Ûnbekende lokaasje', - 'pl': u'Nieznana lokalizacja', - 'pt': u'Localização desconhecida', - 'pt-br': u'Localização desconhecida', - 'ro': u'Localitate necunoscută', - 'ru': u'Неизвестное местоположение', - 'sk': u'Neznáma poloha', - 'sl': u'Neznano lokacijo', - 'sr': u'Непозната локација', - 'sv': u'Okänd plats', - 'te': u'తెలియని ప్రదేశం', - 'tr': u'Bilinmeyen konum', - 'th': u'ไม่สามารถระบุตำแหน่งได้', - 'uk': u'Невідоме місце', - 'uz': u'Аникланмаган худуд', - 'zh': u'未知地点', - 'vi': u'Địa điểm không xác định', - 'zh-tw': u'未知位置', - }, - - 'LOCATION': { - 'en': u'Location', - 'af': u'Ligging', - 'ar': u'الموقع', - 'be': u'Месцазнаходжанне', - 'bg': u'Местоположение', - 'bs': u'Lokacija', - 'ca': u'Ubicació', - 'cs': u'Poloha', - 'cy': u'Lleoliad', - 'de': u'Ort', - 'da': u'Lokation', - 'el': u'Τοποθεσία', - 'es': u'Ubicación', - 'et': u'Asukoht', - 'eu': u'Kokaena', - 'fa': u'مکان', - 'fi': u'Tuntematon sijainti', - 'fr': u'Emplacement', - 'ga': u'Ceantar', - 'hi': u'स्थान', - 'hu': u'Lokáció', - 'hy': u'Դիրք', - 'ia': u'Location', - 'id': u'Lokasi', - 'is': u'Staðsetning', - 'it': u'Località', - 'ja': u'位置情報', - 'ko': u'위치', - 'kk': u'', - 'lv': u'Atrašanās vieta', - 'mk': u'Локација', - 'nb': u'Sted', - 'nl': u'Locatie', - 'oc': u'Emplaçament', - 'fy': u'Lokaasje', - 'pl': u'Lokalizacja', - 'pt': u'Localização', - 'pt-br': u'Localização', - 'ro': u'Localitate', - 'ru': u'Местоположение', - 'sk': u'Poloha', - 'sl': u'Lokacijo', - 'sr': u'Локација', - 'sv': u'Plats', - 'zh': u'地点', - 'te': u'స్థానము', - 'tr': u'Konum', - 'th': u'ตำแหน่ง', - 'uk': u'Місцезнаходження', - 'vi': u'Địa điểm', - 'zh-tw': u'位置', - }, - - 'CAPACITY_LIMIT_REACHED': { - 'en': u""" -Sorry, we are running out of queries to the weather service at the moment. -Here is the weather report for the default city (just to show you what it looks like). -We will get new queries as soon as possible. -You can follow https://twitter.com/igor_chubin for the updates. -====================================================================================== -""", - 'af': u""" -Verskoning, ons oorskry tans die vermoë om navrae aan die weerdiens te rig. -Hier is die weerberig van 'n voorbeeld ligging (bloot om aan u te wys hoe dit lyk). -Ons sal weereens nuwe navrae kan hanteer so gou as moontlik. -U kan vir https://twitter.com/igor_chubin volg vir opdaterings. -====================================================================================== -""", - 'ar': u""" -نأسف, نفذت منا طلبات إستعلام خدمة الطقس في هذه اللحظة. -هذا التقرير الجوي للمدينة الإفتراضية (فقط لنريك, الشكل الذي تبدو عليه). -سوف نحصل علي طلبات إستعلام جديدة في أقرب وقت ممكن. -يمكنك متابعة https://twitter.com/igor_chubin من أجل الحصول علي أخر المستجدات. -====================================================================================== -""", - 'be': u""" -Прабачце, мы выйшлі за ліміты колькасці запытаў да службы надвор'я ў дадзены момант. -Вось прагноз надвор'я для горада па змаўчанні (толькі, каб паказаць вам, як гэта выглядае). -Мы вернемся як мага хутчэй. -Вы можаце сачыць на https://twitter.com/igor_chubin за абнаўленнямі. -====================================================================================== -""", - 'bg': u""" -Съжаляваме, количеството заявки към услугата за предсказване на време е почти изчерпано. -Ето доклад за града по подразбиране (просто да видите как изглежда). -Ще осогурим допълнителни заявки максимално бързо. -Може да последвате https://twitter.com/igor_chubin за обновления. -""", - 'bs': u""" -Žao mi je, mi ponestaje upita i vremenska prognoza u ovom trenutku. -Ovdje je izvještaj o vremenu za default grada (samo da vam pokažem kako to izgleda). -Mi ćemo dobiti nove upite u najkraćem mogućem roku. -Možete pratiti https://twitter.com/igor_chubin za ažuriranja. -====================================================================================== -""", - 'ca': u""" -Disculpa'ns, ens hem quedat momentàniament sense consultes al servei meteorològic. -Aquí t'oferim l'informe del temps a la ciutat per defecte (només per mostrar quin aspecte té). -Obtindrem noves consultes tan aviat com ens sigui possible. -Pots seguir https://twitter.com/igor_chubin per noves actualitzacions. -====================================================================================== -""", - 'de': u""" -Entschuldigung, wir können momentan den Wetterdienst nicht erreichen. -Dafür zeigen wir Ihnen das Wetter an einem Beispielort, damit Sie sehen, wie die Seite das Wetter anzeigt. -Wir werden versuchen das Problem so schnell wie möglich zu beheben. -Folgen Sie https://twitter.com/igor_chubin für Updates. -====================================================================================== -""", - 'cy': u""" -Rydym yn brin o ymholiadau i'r gwasanaeth tywydd ar hyn o bryd. -Felly dyma'r adroddiad tywydd ar gyfer y ddinas ragosod (er mwyn arddangos sut mae'n edrych). -Byddwn gyda ymholiadau newydd yn fuan. -Gellir dilyn https://twitter.com/igor_chubin i gael newyddion pellach. -====================================================================================== -""", - 'es': u""" -Lo siento, hemos alcanzado el límite de peticiones al servicio de previsión del tiempo en este momento. -A continuación, la previsión del tiempo para una ciudad estándar (solo para que puedas ver el formato del reporte). -Muy pronto volveremos a tener acceso a las peticiones. -Puedes seguir https://twitter.com/igor_chubin para estar al tanto de la situación. -====================================================================================== -""", - 'fa': u""" -متأسفانه در حال حاضر ظرفیت ما برای درخواست به سرویس هواشناسی به اتمام رسیده. -اینجا می تونید گزارش هواشناسی برای شهر پیش فرض رو ببینید (فقط برای اینه که بهتون نشون بدیم چه شکلی هست) -ما تلاش میکنیم در اسرع وقت ظرفیت جدید به دست بیاریم. -برای دنبال کردن اخبار جدید میتونید https://twitter.com/igor_chubin رو فالو کنید. -====================================================================================== -""", - 'fr': u""" -Désolé, nous avons épuisé les requêtes vers le service météo. -Voici un bulletin météo de l'emplacement par défaut (pour vous donner un aperçu). -Nous serons très bientôt en mesure de faire de nouvelles requêtes. -Vous pouvez suivre https://twitter.com/igor_chubin pour rester informé. -====================================================================================== -""", - 'ga': u""" -Tá brón orainn, níl mórán iarratas le fail chuig seirbhís na haimsire faoi láthair. -Seo duit réamhaisnéis na haimsire don chathair réamhshocraithe (chun é a thaispeaint duit). -Gheobhaimid iarratais nua chomh luath agus is feidir. -Lean orainn ar https://twitter.com/igor_chubin don eolas is déanaí. -====================================================================================== -""", - 'hi': u""" -क्षमा करें, इस समय हम मौसम सेवा से संपर्क नहीं कर पा रहे है। -यहा पूर्व निर्धारित शहर के लिए मौसम की जानकारी (आपको यह दिखाने के लिए कि यह कैसा दिखता है)। -हम जल्द से जल्द मौसम सेवा से संपर्क करने नई कोशिश करेंगे। -आप अपडेट के लिए https://twitter.com/igor_chubin का अनुसरण कर सकते हैं। -====================================================================================== -""", - 'hu': u""" -Sajnáljuk, kifogytunk az időjárási szolgáltatásra fordított erőforrásokból. -Itt van az alapértelmezett város időjárási jelentése (hogy lásd, hogyan néz ki). -A lehető leghamarabb új erőforrásokat fogunk kapni. -A frissítésekért tekintsd meg a https://twitter.com/igor_chubin oldalt. -====================================================================================== -""", - 'hy': u""" -Կներեք, այս պահին մենք գերազանցել ենք եղանակային տեսության կայանին հարցումների քանակը. -Կարող եք տեսնել տիպային եղանակը զեկուցում հիմնական քաղաքի համար (Ուղղակի որպես նմուշ): -Մենք մշտապես աշխատում ենք հարցումների քանակը բարելավելու ուղղությամբ: -Կարող եք հետևել մեզ https://twitter.com/igor_chubin թարմացումների համար. -====================================================================================== -""", - 'ia': u""" -Pardono, nos ha exhaurite inquisitione del servicio tempore alora. -Ecce es le reporto tempore por qualque citate (demonstrar le reporte). -Nos recipera inquisitione nove tosto. -Tu pote abonar a https://twitter.com/igor_chubin por nove information. -====================================================================================== -""", - 'id': u""" -Maaf, kami kehabian permintaan ke layanan cuaca saat ini. -Ini adalah laporan cuaca dari kota standar (hanya untuk menunjukkan kepada anda bagaimana tampilannya). -Kami akan mencoba permintaan baru lagi sesegera mungkin. -Anda dapat mengikuti https://twitter.com/igor_chubin untuk informasi terbaru. -====================================================================================== -""", - 'it': u""" -Scusate, attualmente stiamo esaurendo le risorse a disposizione del servizio meteo. -Qui trovate il bollettino del tempo per la città di default (solo per mostrarvi come si presenta). -Potremo elaborare nuove richieste appena possibile. -Potete seguire https://twitter.com/igor_chubin per gli aggiornamenti. -====================================================================================== -""", - 'ko': u""" -죄송합니다. 현재 날씨 정보를 가져오는 쿼리 요청이 한도에 도달했습니다. -대신 기본으로 설정된 도시에 대한 일기 예보를 보여드리겠습니다. (이는 단지 어떻게 보이는지 알려주기 위함입니다). -쿼리 요청이 가능한 한 빨리 이루어질 수 있도록 하겠습니다. -업데이트 소식을 원하신다면 https://twitter.com/igor_chubin 을 팔로우 해주세요. -====================================================================================== -""", - 'lv': u""" -Atvainojiet, uz doto brīdi mēs esam mazliet noslogoti. -Šeit ir laika ziņas noklusējuma pilsētai (lai parādītu jums, kā izskatās izveidotais ziņojums). -Mēs atsāksim darbu cik ātri vien varēsim. -Jūs varat sekot https://twitter.com/igor_chubin lai redzētu visus jaunumus. -====================================================================================== -""", - 'mk': u""" -Извинете, ни снемуваат барања за до сервисот кој ни нуди временска прогноза во моментот. -Еве една временска прогноза за град (за да видите како изгледа). -Ќе добиеме нови барања најбрзо што можеме. -Следете го https://twitter.com/igor_chubin за известувања -====================================================================================== -""", - 'nb': u""" -Beklager, vi kan ikke nå værtjenesten for øyeblikket. -Her er værmeldingen for standardbyen så du får se hvordan tjenesten ser ut. -Vi vil forsøke å fikse problemet så snart som mulig. -Du kan følge https://twitter.com/igor_chubin for oppdateringer. -====================================================================================== -""", - 'zh': u""" -抱歉,当前天气服务不可用。 -以下显示默认城市(只对您可见)。 -我们将会尽快获取新数据。 -您可以通过 https://twitter.com/igor_chubin 获取最新动态。 -====================================================================================== -""", - 'nl': u""" -Excuse, wij kunnen u op dit moment dit weerbericht niet laten zien. -Hier is het weerbericht voor de standaard stad(zodat u weet hoe het er uitziet) -Wij lossen dit probleem zo snel mogelijk op. -voor updates kunt u ons op https://twitter.com/igor_chubin volgen. -====================================================================================== -""", - 'oc': u""" -O planhèm, avèm pas mai de requèstas cap al servici metèo. -Vaquí las prevision metèo de l'emplaçament per defaut (per vos donar un apercebut). -Poirem lèu ne far de novèlas. -Podètz seguir https://twitter.com/igor_chubin per demorar informat. -====================================================================================== -""", - 'fy': u""" -Excuses, wy kinne op dit moment 't waarberjocht net sjin litte. -Hjir is 't waarberjocht foar de standaard stêd. -Wy losse dit probleem sa gau mooglik op. -Foar updates kinne jo ús op https://twitter.com/igor_chubin folgje. -====================================================================================== -""", - 'pl': u""" -Bardzo nam przykro, ale chwilowo wykorzystaliśmy limit zapytań do serwisu pogodowego. -To, co widzisz jest przykładowym raportem pogodowym dla domyślnego miasta. -Postaramy się przywrócić funkcjonalność tak szybko, jak to tylko możliwe. -Możesz śledzić https://twitter.com/igor_chubin na Twitterze, aby być na bieżąco. -====================================================================================== -""", - 'pt': u""" -Desculpe-nos, estamos atingindo o limite de consultas ao serviço de previsão do tempo neste momento. -Veja a seguir a previsão do tempo para uma cidade padrão (apenas para você ver que aspecto o relatório tem). -Em breve voltaremos a ter acesso às consultas. -Você pode seguir https://twitter.com/igor_chubin para acompanhar a situação. -====================================================================================== -""", - 'pt-br': u""" -Desculpe-nos, atingimos o limite de consultas ao serviço de previsão do tempo neste momento. -Veja a seguir a previsão do tempo para uma cidade padrão (apenas para você ver que aspecto o relatório tem). -Em breve voltaremos a ter acesso às consultas. -Você pode seguir https://twitter.com/igor_chubin para acompanhar a situação. -====================================================================================== -""", - 'ro': u""" -Ne pare rău, momentan am epuizat cererile alocate de către serviciul de prognoză meteo. -Vă arătăm prognoza meteo pentru localitatea implicită (ca exemplu, să vedeți cum arată). -Vom obține alocarea de cereri noi cât de curând posibil. -Puteți urmări https://twitter.com/igor_chubin pentru actualizări. -====================================================================================== -""", - 'te': u""" -క్షమించండి, ప్రస్తుతానికి మేము వాతావరణ సేవకు ప్రశ్నలను గడుపుతున్నాం. -ఇక్కడ డిఫాల్ట్ నగరం కోసం వాతావరణ నివేదిక (కేవలం మీకు చూపించడానికి, ఇది ఎలా కనిపిస్తుంది). -సాధ్యమైనంత త్వరలో కొత్త ప్రశ్నలను పొందుతారు. -నవీకరణల కోసం https://twitter.com/igor_chubin ను మీరు అనుసరించవచ్చు. -====================================================================================== -""", - 'tr': u""" -Üzgünüz, an itibariyle hava durumu servisine yapabileceğimiz sorgu limitine ulaştık. -Varsayılan şehir için hava durumu bilgisini görüyorsunuz (neye benzediğini gösterebilmek için). -Mümkün olan en kısa sürede servise yeniden sorgu yapmaya başlayacağız. -Gelişmeler için https://twitter.com/igor_chubin adresini takip edebilirsiniz. -====================================================================================== -""", - 'th': u""" -ขออภัย การเรียกค้นหาระบบสภาพอากาศของเราหมดชั่วคราว -เราจึงแสดงข้อมูลของเมืองตัวอย่าง (เพื่อที่จะแสดงให้คุณเห็นว่าหน้าตาเป็นยังไง) -เราจะเรียกค้นหาใหม่โดยเร็วที่สุด -คุณสามารถติดตามการอัพเดทได้ที่ https://twitter.com/igor_chubin -====================================================================================== -""", - 'da': u""" -Beklager, men vi er ved at løbe tør for forespørgsler til vejr-servicen lige nu. -Her er vejr rapporten for standard byen (bare så du ved hvordan det kan se ud). -Vi får nye forespørsler hurtigst muligt. -Du kan følge https://twitter.com/igor_chubin for at få opdateringer. -====================================================================================== -""", - 'et': u""" -Vabandage, kuid hetkel on päringud ilmateenusele piiratud. -Selle asemel kuvame hetkel näidislinna ilmaprognoosi (näitamaks, kuidas see välja näeb). -Üritame probleemi lahendada niipea kui võimalik. -Jälgige https://twitter.com/igor_chubin värskenduste jaoks. -====================================================================================== -""", - 'uk': u""" -Вибачте, ми перевищили максимальну кількість запитів до сервісу погоди. -Ось прогноз погоди у нашому місті (просто показати Вам як це виглядає). -Ми відновимо роботу як тільки зможемо. -Ви можете підписатися на https://twitter.com/igor_chubin для отримання новин. -====================================================================================== -""", - 'vi': u""" -Xin lỗi, hiện tại chúng tôi đã hết lượt yêu cầu thông tin thời tiết. -Đây là dự báo thời tiết cho thành phố mặc định (chỉ để cho bạn thấy nó trông như thế nào). -Chung tôi sẽ có thêm lượt truy vấn sớm nhất có thể -Bạn có thể theo dõi https://twitter.com/igor_chubin để cập nhật thông tin mới nhất. -====================================================================================== -""", - 'zh-tw': u""" -抱歉,目前天氣服務的查詢請求太多了。 -這裡是預設城市的天氣報告(只是為您展示它的外觀)。 -我們將盡快取得新的資料。 -您可以追蹤 https://twitter.com/igor_chubin 以取得更新。 -====================================================================================== -""", - }, - - # Historical messages: - # 'Check new Feature: \033[92mwttr.in/Moon\033[0m or \033[92mwttr.in/Moon@2016-Mar-23\033[0m to see the phase of the Moon' - # 'New feature: \033[92mwttr.in/Rome?lang=it\033[0m or \033[92mcurl -H "Accept-Language: it" wttr.in/Rome\033[0m for the localized version. Your lang instead of "it"' - - 'NEW_FEATURE': { - 'en': u'New feature: multilingual location names \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) and location search \033[92mwttr.in/~Kilimanjaro\033[0m (just add ~ before)', - 'ar': u'ميزة جديدة : أسماء الأماكن بلغات متعددة \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) والبحث عن الأماكن \033[92mwttr.in/~Kilimanjaro\033[0m (فقط أضف ~ قبل)', - 'af': u'Nuwe eienskap: veeltalige name vir liggings \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) en ligging soek \033[92mwttr.in/~Kilimanjaro\033[0m (plaas net ~ vooraan)', - 'be': u'Новыя магчымасці: назвы месц на любой мове \033[92mwttr.in/станция+Восток\033[0m (в UTF-8) i пошук месц \033[92mwttr.in/~Kilimanjaro\033[0m (трэба дадаць ~ ў пачатак)', - 'bg': u'Нова функционалност: многоезични имена на места\033[92mwttr.in/станция+Восток\033[0m (в UTF-8) и в търсенето \033[92mwttr.in/~Kilimanjaro\033[0m (добавете ~ преди)', - 'bs': u'XXXXXXXXXXXXXXXXXXXX: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX\033[92mwttr.in/станция+Восток\033[0m (XX UTF-8) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', - 'ca': u'Noves funcionalitats: noms d\'ubicació multilingües \033[92mwttr.in/станция+Восток\033[0m (en UTF-8) i la ubicació de recerca \033[92mwttr.in/~Kilimanjaro\033[0m (només cal afegir ~ abans)', - 'es': u'Nuevas funcionalidades: los nombres de las ubicaciones en varios idiomas \033[92mwttr.in/станция+Восток\033[0m (em UTF-8) y la búsqueda por ubicaciones \033[92mwttr.in/~Kilimanjaro\033[0m (tan solo inserte ~ en frente)', - 'fa': u'قابلیت جدید: پشتیبانی از نام چند زبانه مکانها \033[92mwttr.in/станция+Восток\033[0m (در فرمت UTF-8) و جسجتوی مکان ها \033[92mwttr.in/~Kilimanjaro\033[0m (فقط قبل از اون ~ اضافه کنید)', - 'fr': u'Nouvelles fonctionnalités: noms d\'emplacements multilingues \033[92mwttr.in/станция+Восток\033[0m (en UTF-8) et recherche d\'emplacement \033[92mwttr.in/~Kilimanjaro\033[0m (ajouter ~ devant)', - 'mk': u'Нова функција: повеќе јазично локациски имиња \033[92mwttr.in/станция+Восток\033[0m (во UTF-8) и локациско пребарување \033[92mwttr.in/~Kilimanjaro\033[0m (just add ~ before)', - 'nb': u'Ny funksjon: flerspråklige stedsnavn \033[92mwttr.in/станция+Восток\033[0m (i UTF-8) og lokasjonssøk \033[92mwttr.in/~Kilimanjaro\033[0m (bare legg til ~ foran)', - 'nl': u'Nieuwe functie: tweetalige locatie namen \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) en locatie zoeken \033[92mwttr.in/~Kilimanjaro\033[0m (zet er gewoon een ~ voor)', - 'fy': u'Nije funksje: twatalige lokaasje nammen \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) en lokaasje sykjen \033[92mwttr.in/~Kilimanjaro\033[0m (set er gewoan in ~ foar)', - 'cy': u'Nodwedd newydd: enwau lleoliadau amlieithog \033[92mwttr.in/станция+Восток\033[0m (yn UTF-8) a chwilio am leoliad \033[92mwttr.in/~Kilimanjaro\033[0m (ychwanegwch ~ yn gyntaf)', - 'de': u'Neue Funktion: mehrsprachige Ortsnamen \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) und Ortssuche \033[92mwttr.in/~Kilimanjaro\033[0m (fügen Sie ein ~ vor dem Ort ein)', - 'hi': u'नई सुविधा: बहुभाषी स्थान के नाम \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) और स्थान खोज \033[92mwttr.in/~Kilimanjaro\033[0m (बस ~ आगे लगाये)', - 'hu': u'Új funkcinalitás: többnyelvű helynevek \033[92mwttr.in/станция+Восток\033[0m (UTF-8-ban) és pozíció keresés \033[92mwttr.in/~Kilimanjaro\033[0m (csak adj egy ~ jelet elé)', - 'hy': u'Փորձարկեք: տեղամասերի անունները կամայական լեզվով \033[92mwttr.in/Դիլիջան\033[0m (в UTF-8) և տեղանքի որոնում \033[92mwttr.in/~Kilimanjaro\033[0m (հարկավոր է ~ ավելացնել դիմացից)', - 'ia': u'Nove functione: location nomine multilingue \033[92mwttr.in/станция+Восток\033[0m (a UTF-8) e recerca de location\033[92mwttr.in/~Kilimanjaro\033[0m (solo adde ~ ante)', - 'id': u'Fitur baru: nama lokasi dalam multibahasa \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) dan pencarian lokasi \033[92mwttr.in/~Kilimanjaro\033[0m (hanya tambah tanda ~ sebelumnya)', - 'it': u'Nuove funzionalità: nomi delle località multilingue \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) e ricerca della località \033[92mwttr.in/~Kilimanjaro\033[0m (basta premettere ~)', - 'ko': u'새로운 기능: 다국어로 대응된 위치 \033[92mwttr.in/서울\033[0m (UTF-8에서) 장소 검색 \033[92mwttr.in/~Kilimanjaro\033[0m (앞에 ~를 붙이세요)', - 'kk': u'', - 'lv': u'Jaunums: Daudzvalodu atrašanās vietu nosaukumi \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) un dabas objektu meklēšana \033[92mwttr.in/~Kilimanjaro\033[0m (tikai priekšā pievieno ~)', - 'mk': u'Нова функција: повеќе јазично локациски имиња \033[92mwttr.in/станция+Восток\033[0m (во UTF-8) и локациско пребарување \033[92mwttr.in/~Kilimanjaro\033[0m (just add ~ before)', - 'oc': u'Novèla foncionalitat : nom de lòc multilenga \033[92mwttr.in/станция+Восток\033[0m (en UTF-8) e recèrca de lòc \033[92mwttr.in/~Kilimanjaro\033[0m (solament ajustatz ~ abans)', - 'pl': u'Nowa funkcjonalność: wielojęzyczne nazwy lokalizacji \033[92mwttr.in/станция+Восток\033[0m (w UTF-8) i szukanie lokalizacji \033[92mwttr.in/~Kilimanjaro\033[0m (poprzedź zapytanie ~ - znakiem tyldy)', - 'pt': u'Nova funcionalidade: nomes de localidades em várias línguas \033[92mwttr.in/станция+Восток\033[0m (em UTF-8) e procura por localidades \033[92mwttr.in/~Kilimanjaro\033[0m (é só colocar ~ antes)', - 'pt-br': u'Nova funcionalidade: nomes de localidades em várias línguas \033[92mwttr.in/станция+Восток\033[0m (em UTF-8) e procura por localidades \033[92mwttr.in/~Kilimanjaro\033[0m (é só colocar ~ antes)', - 'ro': u'Funcționalitate nouă: nume de localități multilingve \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) și căutare de localități \033[92mwttr.in/~Kilimanjaro\033[0m (adăuați ~ în față)', - 'ru': u'Попробуйте: названия мест на любом языке \033[92mwttr.in/станция+Восток\033[0m (в UTF-8) и поиск мест \033[92mwttr.in/~Kilimanjaro\033[0m (нужно добавить ~ спереди)', - 'zh': u'新功能:多语言地点名称 \033[92mwttr.in/станция+Восток\033[0m (in UTF-8) 及地点搜索\033[92mwttr.in/~Kilimanjaro\033[0m (只需在名称前加~)', - 'tr': u'Yeni özellik: çok dilli konum isimleri \033[92mwttr.in/станция+Восток\033[0m (UTF-8 ile) ve konum arama \033[92mwttr.in/~Kilimanjaro\033[0m (sadece önüne ~ ekleyin)', - 'te': u'క్రొత్త లక్షణం: బహుభాషా స్థాన పేర్లు \ 033 [92mwttr.in/stancelя+Vostок\033 [0 U (UTF-8 లో) మరియు స్థానం శోధన \ 033 [92mwttr.in/~kilimanjaro\033 [0m (కేవలం ~ ముందుకి జోడించండి)', - 'th': u'ฟีเจอร์ใหม่: แสดงที่ตั้งได้หลายภาษา \033[92mwttr.in/станция+Восток\033[0m (ใน UTF-8) และการค้นหาที่ตั้ง \033[92mwttr.in/~Kilimanjaro\033[0m (เพียงเพิ่ม ~ ข้างหน้า)', - 'da': u'Ny funktion: flersprogede lokationsnavne \033[92mwttr.in/станция+Восток\033[0m (som UTF-8) og lokations søgning \033[92mwttr.in/~Kilimanjaro\033[0m (bare tilføj ~ inden)', - 'et': u'Uus funktsioon: mitmekeelsed asukohanimed \033[92mwttr.in/станция+Восток\033[0m (UTF-8 vormingus) ja asukoha otsing \033[92mwttr.in/~Kilimanjaro\033[0m (lisa ~ enne)', - 'uk': u'Спробуйте: назви місць будь-якою мовою \033[92mwttr.in/станція+Восток\033[0m (в UTF-8) та пошук місць \033[92mwttr.in/~Kilimanjaro\033[0m (потрібно додати ~ спочатку)', - 'vi': u'Chức năng mới: tên địa điểm đa ngôn ngữ \033[92mwttr.in/станция+Восток\033[0m (dùng UTF-8) và tìm kiếm địa điểm \033[92mwttr.in/~Kilimanjaro\033[0m (chỉ cần thêm ~ phía trước)', - 'zh-tw': u'新功能:多語言地點名稱 \033[92mwttr.in/станция+Восток\033[0m (使用 UTF-8 編碼)與位置搜尋 \033[92mwttr.in/~Kilimanjaro\033[0m (只要在地點前加 ~ 就可以了)', - }, - - 'FOLLOW_ME': { - 'en': u'Follow \033[46m\033[30m@igor_chubin\033[0m for wttr.in updates', - 'ar': u'تابع \033[46m\033[30m@igor_chubin\033[0m من أجل wttr.in أخر مستجدات', - 'af': u'Volg \033[46m\033[30m@igor_chubin\033[0m vir wttr.in opdaterings', - 'be': u'Сачыце за \033[46m\033[30m@igor_chubin\033[0m за навінамі wttr.in', - 'bg': u'Последвай \033[46m\033[30m@igor_chubin\033[0m за обновления свързани с wttr.in', - 'bs': u'XXXXXX \033[46m\033[30m@igor_chubin\033[0m XXXXXXXXXXXXXXXXXXX', - 'ca': u'Segueix \033[46m\033[30m@igor_chubin\033[0m per actualitzacions de wttr.in', - 'es': u'Seguir \033[46m\033[30m@igor_chubin\033[0m para recibir las novedades de wttr.in', - 'eu': u'\033[46m\033[30m@igor_chubin\033[0m jarraitu wttr.in berriak jasotzeko', - 'cy': u'Dilyner \033[46m\033[30m@igor_Chubin\033[0m am diweddariadau wttr.in', - 'fa': u'برای دنبال کردن خبرهای wttr.in شناسه \033[46m\033[30m@igor_chubin\033[0m رو فالو کنید.', - 'fr': u'Suivez \033[46m\033[30m@igor_Chubin\033[0m pour rester informé sur wttr.in', - 'de': u'Folgen Sie \033[46m\033[30mhttps://twitter.com/igor_chubin\033[0m für wttr.in Updates', - 'ga': u'Lean \033[46m\033[30m@igor_chubin\033[0m don wttr.in eolas is deanaí', - 'hi': u'अपडेट के लिए फॉलो करें \033[46m\033[30m@igor_chubin\033[0m', - 'hu': u'Kövesd \033[46m\033[30m@igor_chubin\033[0m-t további wttr.in információkért', - 'hy': u'Նոր ֆիչռների համար հետևեք՝ \033[46m\033[30m@igor_chubin\033[0m', - 'ia': u'Seque \033[46m\033[30m@igor_chubin\033[0m por nove information de wttr.in', - 'id': u'Ikuti \033[46m\033[30m@igor_chubin\033[0m untuk informasi wttr.in terbaru', - 'it': u'Seguite \033[46m\033[30m@igor_chubin\033[0m per aggiornamenti a wttr.in', - 'ko': u'wttr.in의 업데이트 소식을 원하신다면 \033[46m\033[30m@igor_chubin\033[0m 을 팔로우 해주세요', - 'kk': u'', - 'lv': u'Seko \033[46m\033[30m@igor_chubin\033[0m , lai uzzinātu wttr.in jaunumus', - 'mk': u'Следете \033[46m\033[30m@igor_chubin\033[0m за wttr.in новости', - 'nb': u'Følg \033[46m\033[30m@igor_chubin\033[0m for wttr.in oppdateringer', - 'nl': u'Volg \033[46m\033[30m@igor_chubin\033[0m voor wttr.in updates', - 'oc': u'Seguissètz \033[46m\033[30m@igor_Chubin\033[0m per demorar informat sus wttr.in', - 'fy': u'Folgje \033[46m\033[30m@igor_chubin\033[0m foar wttr.in updates', - 'pl': u'Śledź \033[46m\033[30m@igor_chubin\033[0m aby być na bieżąco z nowościami dotyczącymi wttr.in', - 'pt': u'Seguir \033[46m\033[30m@igor_chubin\033[0m para as novidades de wttr.in', - 'pt-br': u'Seguir \033[46m\033[30m@igor_chubin\033[0m para as novidades de wttr.in', - 'ro': u'Urmăriți \033[46m\033[30m@igor_chubin\033[0m pentru actualizări despre wttr.in', - 'ru': u'Все новые фичи публикуются здесь: \033[46m\033[30m@igor_chubin\033[0m', - 'zh': u'关注 \033[46m\033[30m@igor_chubin\033[0m 获取 wttr.in 动态', - 'te': u'అనుసరించండి \ 033 [46m \ 033 [30m @ igor_chubin \ 033 [wttr.in నవీకరణలను కోసం', - 'tr': u'wttr.in ile ilgili gelişmeler için \033[46m\033[30m@igor_chubin\033[0m adresini takip edin', - 'th': u'ติดตาม \033[46m\033[30m@igor_chubin\033[0m สำหรับการอัพเดท wttr.in', - 'da': u'Følg \033[46m\033[30m@igor_chubin\033[0m for at få wttr.in opdateringer', - 'et': u'Jälgi \033[46m\033[30m@igor_chubin\033[0m wttr.in uudiste tarbeks', - 'uk': u'Нові можливості wttr.in публікуються тут: \033[46m\033[30m@igor_chubin\033[0m', - 'vi': u'Theo dõi \033[46m\033[30m@igor_chubin\033[0m để cập nhật thông tin về wttr.in', - 'zh-tw': u'追蹤 \033[46m\033[30m@igor_chubin\033[0m 以取得更多 wttr.in 的動態', - }, -} -CAPTION = { - "af": u"Weer verslag vir:", - "ar": u"تقرير جوي", - "az": u"Hava proqnozu:", - "be": u"Прагноз надвор'я для:", - "bg": u"Прогноза за времето в:", - "bs": u"Vremenske prognoze za:", - "ca": u"Informe del temps per a:", - "cs": u"Předpověď počasí pro:", - "cy": u"Adroddiad tywydd ar gyfer:", - "da": u"Vejret i:", - "de": u"Wetterbericht für:", - "el": u"Πρόγνωση καιρού για:", - "en": u"weather report for:", - "eo": u"Veterprognozo por:", - "es": u"El pronóstico del tiempo en:", - "et": u"Ilmaprognoos:", - "eu": u"Eguraldiaren iragarpena:", - "fa": u"گزارش آب و هئا برای شما:", - "fi": u"Säätiedotus:", - "fr": u"Prévisions météo pour:", - "fy": u"Waarberjocht foar:", - "ga": u"Réamhaisnéis na haimsire do:", - "he": u":ריוואה גזמ תיזחת", - "hi": u"मौसम की जानकारी", - "hr": u"Vremenska prognoza za:", - "hu": u"Időjárás előrejelzés:", - "hy": u"Եղանակի տեսություն:", - "ia": u"Reporto tempore por:", - "id": u"Prakiraan cuaca:", - "it": u"Previsioni meteo:", - "is": u"Veðurskýrsla fyrir:", - "ja": u"天気予報:", - "jv": u"Weather forecast for:", - "ka": u"ამინდის პროგნოზი:", - "kk": u"Ауа райы:", - "ko": u"일기 예보:", - "ky": u"Аба ырайы:", - "lt": u"Orų prognozė:", - "lv": u"Laika ziņas:", - "mk": u"Прогноза за времето во:", - "ml": u"കാലാവസ്ഥ റിപ്പോർട്ട്:", - "nb": u"Værmelding for:", - "nl": u"Weerbericht voor:", - "nn": u"Vêrmelding for:", - "oc": u"Previsions metèo per :", - "pl": u"Pogoda w:", - "pt": u"Previsão do tempo para:", - "pt-br": u"Previsão do tempo para:", - "ro": u"Prognoza meteo pentru:", - "ru": u"Прогноз погоды:", - "sk": u"Predpoveď počasia pre:", - "sl": u"Vremenska napoved za", - "sr": u"Временска прогноза за:", - "sr-lat": u"Vremenska prognoza za:", - "sv": u"Väderleksprognos för:", - "sw": u"Ripoti ya hali ya hewa, jiji la:", - "te": u"వాతావరణ సమాచారము:", - "th": u"รายงานสภาพอากาศ:", - "tr": u"Hava beklentisi:", - "uk": u"Прогноз погоди для:", - "uz": u"Ob-havo bashorati:", - "vi": u"Báo cáo thời tiết:", - "zh": u"天气预报:", - "zu": u"Isimo sezulu:", - "zh-tw": u"天氣報告:", -} - -def get_message(message_name, lang): - if lang == 'zh-cn': - lang = 'zh' - if message_name not in MESSAGE: - return '' - message_dict = MESSAGE[message_name] - return message_dict.get(lang, message_dict.get('en', '')) diff --git a/legacy/lib/translations_v2.py b/legacy/lib/translations_v2.py deleted file mode 100644 index b5550bb..0000000 --- a/legacy/lib/translations_v2.py +++ /dev/null @@ -1,73 +0,0 @@ -# vim: fileencoding=utf-8 - -""" -Translation of v2 -""" - -# pylint: disable=line-too-long,bad-whitespace -V2_TRANSLATION = { - "en": ("Weather report for:", "Weather", "Timezone", "Now", "Dawn", "Sunrise", "Zenith", "Sunset", "Dusk"), - "af": ("Weer verslag vir:", "", "", "", "", "", "", "", ""), - "ar": ("تقرير جوي:", "حالة الجو", "المنطقة الزمنية", "الآن ", "الفجر", "شروق الشمس", "الذروة", "غروب الشمس", "الغسق"), - "az": ("Hava proqnozu:", "Hava", "Saat zonası", "İndi", "Şəfəq", "Günəş çıxdı", "Zenit", "Gün batımı", "Toran"), - "be": ("Прагноз надвор'я для:", "Надвор'е", "Часавая зона", "Цяпер", "Світанак", "Усход сонца", "Зеніт", "Захад сонца", "Змярканне"), - "bg": ("Прогноза за времето в:", "", "", "", "", "", "", "", ""), - "bs": ("Vremenske prognoze za:", "", "", "", "", "", "", "", ""), - "ca": ("Informe del temps per a:", "", "", "", "", "", "", "", ""), - "cs": ("Předpověď počasí pro:", "", "", "", "", "", "", "", ""), - "cy": ("Adroddiad tywydd ar gyfer:", "", "", "", "", "", "", "", ""), - "da": ("Vejret i:", "Vejret", "Tidszone", "Nu", "Daggry", "Solopgang", "Zenit", "Solnedgang", "Skumring"), - "de": ("Wetterbericht für:", "Wetter", "Zeitzone", "Jetzt", "Morgendämmerung", "Sonnenaufgang","Zenit", "Sonnenuntergang", "Abenddämmerung"), - "el": ("Πρόγνωση καιρού για:", "", "", "", "", "", "", "", ""), - "eo": ("Veterprognozo por:", "Vetero", "Horzono", "Nun", "Tagiĝo", "Sunleviĝo", "Zenito", "Sunsubiro", "Krepusko"), - "es": ("El tiempo en:", "Clima", "Zona horaria", "Ahora", "Alborada", "Amanecer", "Cenit", "Atardecer", "Anochecer"), - "et": ("Ilmaprognoos:", "Ilm", "Ajatsoon", "Hetkel", "Koit", "Päikesetõus", "Seniit", "Päikeseloojang", "Eha"), - "fa": ("اوه و بآ تیعضو شرازگ", "", "", "", "", "", "", "", ""), - "fi": ("Säätiedotus:", "", "", "", "", "", "", "", ""), - "fr": ("Prévisions météo pour :", "Météo", "Fuseau Horaire", "Heure", "Aube", "Lever du Soleil", "Zénith", "Coucher du Soleil", "Crépuscule"), - "fy": ("Waarberjocht foar:", "", "", "", "", "", "", "", ""), - "ga": ("Réamhaisnéis na haimsire do:", "", "", "", "", "", "", "", ""), - "he": (":ריוואה גזמ תיזחת", "", "", "", "", "", "", "", ""), - "hi": ("मौसम की जानकारी", "मौसम", "समय मण्डल", "अभी", "उदय", "सूर्योदय", "चरम बिन्दु", "सूर्यास्त", "संध्याकाल"), - "hr": ("Vremenska prognoza za:", "", "", "", "", "", "", "", ""), - "hu": ("Időjárás előrejelzés:", "Időjárás", "időzóna", "aktuális", "hajnal", "napkelte", "dél", "naplemente", "szürkület"), - "hy": ("Եղանակի տեսություն:", "", "", "", "", "", "", "", ""), - "ia": ("Reporto tempore pro:", "Tempore", "Fuso Horari", "Alora", "Alba", "Aurora", "Zenit", "Poner del sol", "Crepusculo"), - "id": ("Prakiraan cuaca:", "", "", "", "", "", "", "", ""), - "it": ("Previsioni meteo:", "Tempo", "Fuso orario", "Ora", "Alba", "Sorgere del Sole", "Zenit", "Tramonto", "Crepuscolo"), - "is": ("Veðurskýrsla fyrir:", "", "", "", "", "", "", "", ""), - "ja": ("天気予報:", "天気", "タイムゾーン", "今", "夜明け", "日の出", "天頂", "日の入", "日暮れ"), - "jv": ("Weather forecast for:", "", "", "", "", "", "", "", ""), - "ka": ("ამინდის პროგნოზი:", "", "", "", "", "", "", "", ""), - "kk": ("Ауа райы:", "", "", "", "", "", "", "", ""), - "ko": ("일기 예보:", "날씨", "시간대", "현재", "새벽", "일출", "정오", "일몰", "황혼"), - "ky": ("Аба ырайы:", "", "", "", "", "", "", "", ""), - "lt": ("Orų prognozė:", "", "", "", "", "", "", "", ""), - "lv": ("Laika ziņas:", "", "", "", "", "", "", "", ""), - "mk": ("Прогноза за времето во:", "", "", "", "", "", "", "", ""), - "ml": ("കാലാവസ്ഥ റിപ്പോർട്ട്:", "", "", "", "", "", "", "", ""), - "nb": ("Værmelding for:", "", "", "", "", "", "", "", ""), - "nl": ("Weerbericht voor:", "Weer", "Tijdzone", "Nu", "Dageraad", "Zonsopkomst", "Zenit", "Zonsondergang", "Schemering"), - "nn": ("Vêrmelding for:", "", "", "", "", "", "", "", ""), - "oc": ("Previsions metèo per:" "Metèo", "Zòna orària", "Ara", "Auròra", "Alba", "Zenit", "A solelh colc", "Entrelutz"), - "pl": ("Pogoda w:", "", "", "", "", "", "", "", ""), - "pt": ("Previsão do tempo para:", "Tempo", "Fuso horário", "Agora", "Alvorada", "Nascer do sol", "Zénite", "Pôr do sol", "Crepúsculo"), - "pt-br": ("Previsão do tempo para:", "Tempo", "Fuso horário", "Agora", "Alvorada", "Nascer do sol", "Zénite", "Pôr do sol", "Crepúsculo"), - "ro": ("Prognoza meteo pentru:", "", "", "", "", "", "", "", ""), - "ru": ("Прогноз погоды:", "Погода", "Часовой пояс", "Сейчас", "Рассвет", "Восход", "Зенит", "Закат", "Сумерки"), - "sk": ("Predpoveď počasia pre:", "", "", "", "", "", "", "", ""), - "sl": ("Vremenska napoved za", "", "", "", "", "", "", "", ""), - "sr": ("Временска прогноза за:", "", "", "", "", "", "", "", ""), - "sr-lat": ("Vremenska prognoza za:", "", "", "", "", "", "", "", ""), - "sv": ("Väderleksprognos för:", "", "", "", "", "", "", "", ""), - "sw": ("Ripoti ya hali ya hewa, jiji la:", "", "", "", "", "", "", "", ""), - "te": ("వాతావరణ సమాచారము:", "", "", "", "", "", "", "", ""), - "th": ("รายงานสภาพอากาศ:", "", "", "", "", "", "", "", ""), - "tr": ("Hava beklentisi:", "Hava Durumu", "Zaman Dilimi", "Şimdi", "Şafak", "Gün Doğumu", "Doruk", "Gün Batımı", "Akşam"), - "uk": ("Прогноз погоди для:", "Погода", "Часовий пояс", "Зараз", "Світанок", "Схід сонця", "Зеніт", "Захід сонця", "Сутінки"), - "uz": ("Ob-havo bashorati:", "", "", "", "", "", "", "", ""), - "vi": ("Báo cáo thời tiết:", "", "", "", "", "", "", "", ""), - "zh": ("天气预报:", "天气", "时区", "当前", "黎明", "日出", "正午", "日落", "黄昏"), - "zh-tw": ("天氣預報:", "天氣", "時區", "目前", "黎明", "日出", "日正當中", "日落", "黃昏"), - "zu": ("Isimo sezulu:", "", "", "", "", "", "", "", ""), - } diff --git a/legacy/lib/view/__init__.py b/legacy/lib/view/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/legacy/lib/view/line.py b/legacy/lib/view/line.py deleted file mode 100644 index 24da1a2..0000000 --- a/legacy/lib/view/line.py +++ /dev/null @@ -1,382 +0,0 @@ -#vim: fileencoding=utf-8 - -""" -One-line output mode. - -Initial implementation of one-line output mode. - -[ ] forecast -[ ] spark -[ ] several locations -[ ] location handling -[ ] more preconfigured format lines -[ ] add information about this mode to /:help -""" - -import sys -import re -import datetime -import json -import requests - -from astral import LocationInfo -from astral import moon -from astral.sun import sun - -import pytz - -from constants import WWO_CODE, WEATHER_SYMBOL, WIND_DIRECTION, WEATHER_SYMBOL_WIDTH_VTE -from weather_data import get_weather_data -from . import v2 -from . import prometheus - -PRECONFIGURED_FORMAT = { - '1': r'%c %t\n', - '2': r'%c 🌡️%t 🌬️%w\n', - '3': r'%l: %c %t\n', - '4': r'%l: %c 🌡️%t 🌬️%w\n', -} - -MOON_PHASES = ( - u"🌑", u"🌒", u"🌓", u"🌔", u"🌕", u"🌖", u"🌗", u"🌘" -) - -def convert_to_fahrenheit(temp): - "Convert Celcius `temp` to Fahrenheit" - - return (temp*9.0/5)+32 - -def render_temperature(data, query): - """ - temperature (t) - """ - - if query.get('use_imperial', False): - temperature = u'%s°F' % data['temp_F'] - else: - temperature = u'%s°C' % data['temp_C'] - - if temperature[0] != '-': - temperature = '+' + temperature - - return temperature - -def render_feel_like_temperature(data, query): - """ - feel like temperature (f) - """ - - if query.get('use_imperial', False): - temperature = u'%s°F' % data['FeelsLikeF'] - else: - temperature = u'%s°C' % data['FeelsLikeC'] - - if temperature[0] != '-': - temperature = '+' + temperature - - return temperature - -def render_condition(data, query): - """Emoji encoded weather condition (c) - """ - - weather_condition = WEATHER_SYMBOL[WWO_CODE[data['weatherCode']]] - spaces = " "*(WEATHER_SYMBOL_WIDTH_VTE.get(weather_condition) - 1) - - return weather_condition + spaces - -def render_condition_fullname(data, query): - """ - condition_fullname (C) - """ - - found = None - for key, val in data.items(): - if key.startswith('lang_'): - found = val - break - if not found: - found = data['weatherDesc'] - - try: - weather_condition = found[0]['value'] - except KeyError: - weather_condition = '' - - return weather_condition - -def render_humidity(data, query): - """ - humidity (h) - """ - - humidity = data.get('humidity', '') - if humidity: - humidity += '%' - return humidity - -def render_precipitation(data, query): - """ - precipitation (p) - """ - - answer = data.get('precipMM', '') - if answer: - answer += 'mm' - return answer - -def render_precipitation_chance(data, query): - """ - precipitation chance (o) - """ - - answer = data.get('chanceofrain', '') - if answer: - answer += '%' - return answer - -def render_pressure(data, query): - """ - pressure (P) - """ - - answer = data.get('pressure', '') - if answer: - answer += 'hPa' - return answer - -def render_wind(data, query): - """ - wind (w) - """ - - try: - degree = data["winddirDegree"] - except KeyError: - degree = "" - - try: - degree = int(degree) - except ValueError: - degree = "" - - if degree: - wind_direction = WIND_DIRECTION[int(((degree+22.5)%360)/45.0)] - else: - wind_direction = "" - - if query.get('use_ms_for_wind', False): - unit = 'm/s' - wind = u'%s%.1f%s' % (wind_direction, float(data['windspeedKmph'])/36.0*10.0, unit) - elif query.get('use_imperial', False): - unit = 'mph' - wind = u'%s%s%s' % (wind_direction, data['windspeedMiles'], unit) - else: - unit = 'km/h' - wind = u'%s%s%s' % (wind_direction, data['windspeedKmph'], unit) - - return wind - -def render_location(data, query): - """ - location (l) - """ - - return (data['override_location'] or data['location']) - -def render_moonphase(_, query): - """moonpahse(m) - A symbol describing the phase of the moon - """ - moon_phase = moon.phase(date=datetime.datetime.today()) - moon_index = int(int(32.0*moon_phase/28+2)%32/4) - return MOON_PHASES[moon_index] - -def render_moonday(_, query): - """moonday(M) - An number describing the phase of the moon (days after the New Moon) - """ - moon_phase = moon.phase(date=datetime.datetime.today()) - return str(int(moon_phase)) - -################################## -# this part should be rewritten -# this is just a temporary solution - -def get_geodata(location): - text = requests.get("http://localhost:8004/%s" % location).text - return json.loads(text) - - -def render_dawn(data, query, local_time_of): - """dawn (D) - Local time of dawn""" - return local_time_of("dawn") - -def render_dusk(data, query, local_time_of): - """dusk (d) - Local time of dusk""" - return local_time_of("dusk") - -def render_sunrise(data, query, local_time_of): - """sunrise (S) - Local time of sunrise""" - return local_time_of("sunrise") - -def render_sunset(data, query, local_time_of): - """sunset (s) - Local time of sunset""" - return local_time_of("sunset") - -def render_zenith(data, query, local_time_of): - """zenith (z) - Local time of zenith""" - return local_time_of("noon") - -################################## - -FORMAT_SYMBOL = { - 'c': render_condition, - 'C': render_condition_fullname, - 'h': render_humidity, - 't': render_temperature, - 'f': render_feel_like_temperature, - 'w': render_wind, - 'l': render_location, - 'm': render_moonphase, - 'M': render_moonday, - 'p': render_precipitation, - 'o': render_precipitation_chance, - 'P': render_pressure, - } - -FORMAT_SYMBOL_ASTRO = { - 'D': render_dawn, - 'd': render_dusk, - 'S': render_sunrise, - 's': render_sunset, - 'z': render_zenith, -} - -def render_line(line, data, query): - """ - Render format `line` using `data` - """ - - def get_local_time_of(): - - location = data["location"] - geo_data = get_geodata(location) - - city = LocationInfo() - city.latitude = geo_data["latitude"] - city.longitude = geo_data["longitude"] - city.timezone = geo_data["timezone"] - - timezone = city.timezone - - local_tz = pytz.timezone(timezone) - - datetime_day_start = datetime.datetime.now()\ - .replace(hour=0, minute=0, second=0, microsecond=0) - current_sun = sun(city.observer, date=datetime_day_start) - - local_time_of = lambda x: current_sun[x]\ - .replace(tzinfo=pytz.utc)\ - .astimezone(local_tz)\ - .strftime("%H:%M:%S") - return local_time_of - - def render_symbol(match): - """ - Render one format symbol from re `match` - using `data` from external scope. - """ - - symbol_string = match.group(0) - symbol = symbol_string[-1] - - if symbol in FORMAT_SYMBOL: - render_function = FORMAT_SYMBOL[symbol] - return render_function(data, query) - if symbol in FORMAT_SYMBOL_ASTRO and local_time_of is not None: - render_function = FORMAT_SYMBOL_ASTRO[symbol] - return render_function(data, query, local_time_of) - - return '' - - template_regexp = r'%[a-zA-Z]' - for template_code in re.findall(template_regexp, line): - if template_code.lstrip("%") in FORMAT_SYMBOL_ASTRO: - local_time_of = get_local_time_of() - break - - return re.sub(template_regexp, render_symbol, line) - -def render_json(data): - output = json.dumps(data, indent=4, sort_keys=True, ensure_ascii=False) - - output = "\n".join( - re.sub('"[^"]*worldweatheronline[^"]*"', '""', line) if "worldweatheronline" in line else line - for line in output.splitlines()) + "\n" - - return output - -def format_weather_data(query, parsed_query, data): - """ - Format information about current weather `data` for `location` - with specified in `format_line` format - """ - - if 'data' not in data: - return 'Unknown location; please try ~%s' % parsed_query["location"] - - format_line = parsed_query.get("view", "") - if format_line in PRECONFIGURED_FORMAT: - format_line = PRECONFIGURED_FORMAT[format_line] - - if format_line == "j1": - return render_json(data['data']) - if format_line == "p1": - return prometheus.render_prometheus(data['data']) - if format_line[:2] == "v2": - return v2.main(query, parsed_query, data) - - current_condition = data['data']['current_condition'][0] - current_condition['location'] = parsed_query["location"] - current_condition['override_location'] = parsed_query["override_location_name"] - output = render_line(format_line, current_condition, query) - return output - -def wttr_line(query, parsed_query): - """ - Return 1line weather information for `location` - in format `line_format` - """ - location = parsed_query['location'] - lang = parsed_query['lang'] - - data = get_weather_data(location, lang) - output = format_weather_data(query, parsed_query, data) - return output.rstrip("\n").replace(r"\n", "\n") - -def main(): - """ - Function for standalone module usage - """ - - location = sys.argv[1] - query = { - 'line': sys.argv[2], - } - parsed_query = { - "location": location, - "orig_location": location, - "language": "en", - "format": "v2", - } - - sys.stdout.write(wttr_line(query, parsed_query)) - -if __name__ == '__main__': - main() diff --git a/legacy/lib/view/moon.py b/legacy/lib/view/moon.py deleted file mode 100644 index 05398a1..0000000 --- a/legacy/lib/view/moon.py +++ /dev/null @@ -1,57 +0,0 @@ -import sys - -import os -import dateutil.parser - -from gevent.subprocess import Popen, PIPE - -sys.path.insert(0, "..") -import constants -import parse_query -import globals - -def get_moon(parsed_query): - - location = parsed_query['orig_location'] - html = parsed_query['html_output'] - lang = parsed_query['lang'] - hemisphere = parsed_query['hemisphere'] - - date = None - if '@' in location: - date = location[location.index('@')+1:] - location = location[:location.index('@')] - - cmd = [globals.PYPHOON] - if lang: - cmd += ["-l", lang] - - if not hemisphere: - cmd += ["-s", "south"] - - if date: - try: - dateutil.parser.parse(date) - except Exception as e: - print("ERROR: %s" % e) - else: - cmd += [date] - - p = Popen(cmd, stdout=PIPE, stderr=PIPE) - stdout = p.communicate()[0] - stdout = stdout.decode("utf-8") - - if parsed_query.get('no-terminal', False): - stdout = globals.remove_ansi(stdout) - - if html: - p = Popen( - ["bash", globals.ANSI2HTML, "--palette=solarized", "--bg=dark"], - stdin=PIPE, stdout=PIPE, stderr=PIPE) - stdout, stderr = p.communicate(stdout.encode("utf-8")) - stdout = stdout.decode("utf-8") - stderr = stderr.decode("utf-8") - if p.returncode != 0: - globals.error(stdout + stderr) - - return stdout diff --git a/legacy/lib/view/prometheus.py b/legacy/lib/view/prometheus.py deleted file mode 100644 index 740ab7f..0000000 --- a/legacy/lib/view/prometheus.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -Rendering weather data in the Prometheus format. - -""" - -from datetime import datetime - -from fields import DESCRIPTION - -def _render_current(data, for_day="current", already_seen=[]): - "Converts data into prometheus style format" - - output = [] - - for field_name, val in DESCRIPTION.items(): - - help, name = val - - try: - value = data[field_name] - if field_name == "weatherDesc": - value = value[0]["value"] - except (IndexError, KeyError): - try: - value = data["astronomy"][0][field_name] - if value.endswith(" AM") or value.endswith(" PM"): - value = _convert_time_to_minutes(value) - except (IndexError, KeyError, ValueError): - continue - - try: - if name == "observation_time": - value = _convert_time_to_minutes(value) - except ValueError: - continue - - description = "" - try: - float(value) - except ValueError: - description = f", description=\"{value}\"" - value = "1" - - if name not in already_seen: - output.append(f"# HELP {name} {help}") - already_seen.append(name) - - output.append(f"{name}{{forecast=\"{for_day}\"{description}}} {value}") - - return "\n".join(output)+"\n" - -def _convert_time_to_minutes(time_str): - "Convert time from midnight to minutes" - return int((datetime.strptime(time_str, "%I:%M %p") - - datetime.strptime("12:00 AM", "%I:%M %p")).total_seconds())//60 - -def render_prometheus(data): - """ - Convert `data` into Prometheus format - and return it as string. - """ - - already_seen = [] - answer = _render_current( - data["current_condition"][0], already_seen=already_seen) - for i in range(3): - answer += _render_current( - data["weather"][i], for_day="%sd" % i, already_seen=already_seen) - return answer diff --git a/legacy/lib/view/v2.py b/legacy/lib/view/v2.py deleted file mode 100644 index 427e7fb..0000000 --- a/legacy/lib/view/v2.py +++ /dev/null @@ -1,633 +0,0 @@ -# vim: fileencoding=utf-8 -# vim: foldmethod=marker foldenable: - -""" -[X] emoji -[ ] wego icon -[ ] v2.wttr.in -[X] astronomical (sunset) -[X] time -[X] frames -[X] colorize rain data -[ ] date + locales -[X] wind color -[ ] highlight current date -[ ] bind to real site -[ ] max values: temperature -[X] max value: rain -[ ] comment github -[ ] commit - -""" - -import sys - -import re -import math -import json -import datetime -import io - -import requests -import diagram -import pyjq -import pytz -import numpy as np -from astral import LocationInfo -from astral import moon, sun -from scipy.interpolate import interp1d -from babel.dates import format_datetime - -from globals import WWO_KEY, remove_ansi -import constants -import translations -import parse_query -from . import line as wttr_line - -if not sys.version_info >= (3, 0): - reload(sys) # noqa: F821 - sys.setdefaultencoding("utf-8") - -# data processing {{{ - -def get_data(config): - """ - Fetch data for `query_string` - """ - - url = ( - 'http://' - 'localhost:5001/premium/v1/weather.ashx' - '?key=%s' - '&q=%s&format=json&num_of_days=3&tp=3&lang=None' - ) % (WWO_KEY, config["location"]) - text = requests.get(url).text - parsed_data = json.loads(text) - return parsed_data - -def interpolate_data(input_data, max_width): - """ - Resample `input_data` to number of `max_width` counts - """ - - input_data = list(input_data) - input_data_len = len(input_data) - x = list(range(input_data_len)) - y = input_data - xvals = np.linspace(0, input_data_len-1, max_width) - yinterp = interp1d(x, y, kind='cubic') - return yinterp(xvals) - -def jq_query(query, data_parsed): - """ - Apply `query` to structued data `data_parsed` - """ - - pyjq_data = pyjq.all(query, data_parsed) - data = list(map(float, pyjq_data)) - return data - -# }}} -# utils {{{ -def colorize(string, color_code, html_output=False): - if html_output: - return "%s" % (string) - else: - return "\033[%sm%s\033[0m" % (color_code, string) -# }}} -# draw_spark {{{ - - -def draw_spark(data, height, width, color_data): - """ - Spark-style visualize `data` in a region `height` x `width` - """ - - _BARS = u' _▁▂▃▄▅▇█' - - def _box(height, row, value, max_value): - row_height = 1.0 * max_value / height - if row_height * row >= value: - return _BARS[0] - if row_height * (row+1) <= value: - return _BARS[-1] - - return _BARS[int(1.0*(value - row_height*row)/(row_height*1.0)*len(_BARS))] - - max_value = max(data) - - output = "" - color_code = 20 - for i in range(height): - for j in range(width): - character = _box(height, height-i-1, data[j], max_value) - if data[j] != 0: - chance_of_rain = color_data[j]/100.0 * 2 - if chance_of_rain > 1: - chance_of_rain = 1 - color_index = int(5*chance_of_rain) - color_code = 16 + color_index # int(math.floor((20-16) * 1.0 * (height-1-i)/height*(max_value/data[j]))) - output += "\033[38;5;%sm%s\033[0m" % (color_code, character) - output += "\n" - - # labeling max value - if max_value == 0: - max_line = " "*width - else: - max_line = "" - for j in range(width): - if data[j] == max_value: - max_line = "%3.2fmm|%s%%" % (max_value, int(color_data[j])) - orig_max_line = max_line - - # aligning it - if len(max_line)//2 < j and len(max_line)//2 + j < width: - spaces = " "*(j - len(max_line)//2) - max_line = spaces + max_line # + spaces - max_line = max_line + " "*(width - len(max_line)) - elif len(max_line)//2 + j >= width: - max_line = " "*(width - len(max_line)) + max_line - - max_line = max_line.replace(orig_max_line, colorize(orig_max_line, "38;5;33")) - - break - - if max_line: - output = "\n" + max_line + "\n" + output + "\n" - - return output - -# }}} -# draw_diagram {{{ -def draw_diagram(data, height, width): - - option = diagram.DOption() - option.size = diagram.Point([width, height]) - option.mode = 'g' - - stream = io.BytesIO() - gram = diagram.DGWrapper( - data=[list(data), range(len(data))], - dg_option=option, - ostream=stream) - gram.show() - return stream.getvalue().decode("utf-8") -# }}} -# draw_date {{{ - - -def draw_date(config, geo_data): - """ - """ - - tzinfo = pytz.timezone(geo_data["timezone"]) - - locale = config.get("locale", "en_US") - datetime_day_start = datetime.datetime.utcnow() - - answer = "" - for day in range(3): - datetime_ = datetime_day_start + datetime.timedelta(hours=24*day) - date = format_datetime(datetime_, "EEE dd MMM", locale=locale, tzinfo=tzinfo) - - spaces = ((24-len(date))//2)*" " - date = spaces + date + spaces - date = " "*(24-len(date)) + date - answer += date - answer += "\n" - - for _ in range(3): - answer += " "*23 + u"╷" - return answer[:-1] + " " - - -# }}} -# draw_time {{{ - - -def draw_time(geo_data): - """ - """ - - tzinfo = pytz.timezone(geo_data["timezone"]) - - line = ["", ""] - - for _ in range(3): - part = u"─"*5 + u"┴" + u"─"*5 - line[0] += part + u"┼" + part + u"╂" - line[0] += "\n" - - for _ in range(3): - line[1] += " 6 12 18 " - line[1] += "\n" - - # highlight current time - hour_number = \ - (datetime.datetime.now(tzinfo) - - datetime.datetime.now(tzinfo).replace(hour=0, minute=0, second=0, microsecond=0) - ).seconds//3600 - - for line_number, _ in enumerate(line): - line[line_number] = \ - line[line_number][:hour_number] \ - + colorize(line[line_number][hour_number], "46") \ - + line[line_number][hour_number+1:] - - return "".join(line) - - -# }}} -# draw_astronomical {{{ -def draw_astronomical(city_name, geo_data, config): - datetime_day_start = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) - - city = LocationInfo() - city.latitude = geo_data["latitude"] - city.longitude = geo_data["longitude"] - city.timezone = geo_data["timezone"] - - answer = "" - moon_line = "" - for time_interval in range(72): - - current_date = ( - datetime_day_start - + datetime.timedelta(hours=1*time_interval)).replace(tzinfo=pytz.timezone(geo_data["timezone"])) - - try: - dawn = sun.dawn(city.observer, date=current_date) - except ValueError: - dawn = current_date - - try: - dusk = sun.dusk(city.observer, date=current_date) - except ValueError: - dusk = current_date + datetime.timedelta(hours=24) - - try: - sunrise = sun.sunrise(city.observer, date=current_date) - except ValueError: - sunrise = current_date - - try: - sunset = sun.sunset(city.observer, date=current_date) - except ValueError: - sunset = current_date + datetime.timedelta(hours=24) - - char = "." - if current_date < dawn: - char = " " - elif current_date > dusk: - char = " " - elif dawn <= current_date and current_date <= sunrise: - char = u"─" - elif sunset <= current_date and current_date <= dusk: - char = u"─" - elif sunrise <= current_date and current_date <= sunset: - char = u"━" - - answer += char - - if config.get("view") in ["v2n", "v2d"]: - moon_phases = constants.MOON_PHASES_WI - moon_phases = [" %s" % x for x in moon_phases] - else: - moon_phases = constants.MOON_PHASES - - # moon - if time_interval in [0,23,47,69]: # time_interval % 3 == 0: - moon_phase = moon.phase( - date=datetime_day_start + datetime.timedelta(hours=time_interval)) - moon_phase_emoji = moon_phases[ - int(math.floor(moon_phase*1.0/28.0*8+0.5)) % len(moon_phases)] - # if time_interval in [0, 24, 48, 69]: - moon_line += moon_phase_emoji # + " " - elif time_interval % 3 == 0: - if time_interval not in [24,28]: #se: - moon_line += " " - else: - moon_line += " " - - - answer = moon_line + "\n" + answer + "\n" - answer += "\n" - return answer -# }}} -# draw_emoji {{{ -def draw_emoji(data, config): - answer = "" - if config.get("view") == "v2n": - weather_symbol = constants.WEATHER_SYMBOL_WI_NIGHT - weather_symbol_width_vte = constants.WEATHER_SYMBOL_WIDTH_VTE_WI - elif config.get("view") == "v2d": - weather_symbol = constants.WEATHER_SYMBOL_WI_NIGHT - weather_symbol_width_vte = constants.WEATHER_SYMBOL_WIDTH_VTE_WI - else: - weather_symbol = constants.WEATHER_SYMBOL - weather_symbol_width_vte = constants.WEATHER_SYMBOL_WIDTH_VTE - - for i in data: - emoji = weather_symbol.get( - constants.WWO_CODE.get( - str(int(i)), "Unknown")) - space = " "*(3-weather_symbol_width_vte.get(emoji, 1)) - answer += space[:1] + emoji + space[1:] - answer += "\n" - return answer -# }}} -# draw_wind {{{ -def draw_wind(data, color_data, config): - - def _color_code_for_wind_speed(wind_speed): - - color_codes = [ - (3, 241), # 82 - (6, 242), # 118 - (9, 243), # 154 - (12, 246), # 190 - (15, 250), # 226 - (19, 253), # 220 - (23, 214), - (27, 208), - (31, 202), - (-1, 196) - ] - - for this_wind_speed, this_color_code in color_codes: - if wind_speed <= this_wind_speed: - return this_color_code - return color_codes[-1][1] - - answer = "" - answer_line2 = "" - - if config.get("view") in ["v2n", "v2d"]: - wind_direction_list = constants.WIND_DIRECTION_WI - else: - wind_direction_list = constants.WIND_DIRECTION - - for j, degree in enumerate(data): - - degree = int(degree) - if degree: - wind_direction = wind_direction_list[int(((degree+22.5)%360)/45.0)] - else: - wind_direction = "" - - color_code = "38;5;%s" % _color_code_for_wind_speed(int(color_data[j])) - answer += " %s " % colorize(wind_direction, color_code) - - # wind_speed - wind_speed = int(color_data[j]) - wind_speed_str = colorize(str(wind_speed), color_code) - if wind_speed < 10: - wind_speed_str = " " + wind_speed_str + " " - elif wind_speed < 100: - wind_speed_str = " " + wind_speed_str - answer_line2 += wind_speed_str - - answer += "\n" - answer += answer_line2 + "\n" - return answer -# }}} -# panel implementation {{{ - -def add_frame(output, width, config): - """ - Add frame arond `output` that has width `width` - """ - - empty_line = " "*width - output = "\n".join(u"│"+(x or empty_line)+u"│" for x in output.splitlines()) + "\n" - - weather_report = \ - translations.CAPTION[config.get("lang") or "en"] \ - + " " \ - + (config["override_location_name"] or config["location"]) - - caption = u"┤ " + " " + weather_report + " " + u" ├" - output = u"┌" + caption + u"─"*(width-len(caption)) + u"┐\n" \ - + output + \ - u"└" + u"─"*width + u"┘\n" - - return output - -def generate_panel(data_parsed, geo_data, config): - """ - """ - - max_width = 72 - - precip_mm_query = "[.data.weather[] | .hourly[]] | .[].precipMM" - precip_chance_query = "[.data.weather[] | .hourly[]] | .[].chanceofrain" - feels_like_query = "[.data.weather[] | .hourly[]] | .[].FeelsLikeC" - weather_code_query = "[.data.weather[] | .hourly[]] | .[].weatherCode" - wind_direction_query = "[.data.weather[] | .hourly[]] | .[].winddirDegree" - wind_speed_query = "[.data.weather[] | .hourly[]] | .[].windspeedKmph" - - output = "" - - output += "\n\n" - - output += draw_date(config, geo_data) - output += "\n" - output += "\n" - output += "\n" - - data = jq_query(feels_like_query, data_parsed) - data_interpolated = interpolate_data(data, max_width) - output += draw_diagram(data_interpolated, 10, max_width) - - output += "\n" - - output += draw_time(geo_data) - - data = jq_query(precip_mm_query, data_parsed) - color_data = jq_query(precip_chance_query, data_parsed) - data_interpolated = interpolate_data(data, max_width) - color_data_interpolated = interpolate_data(color_data, max_width) - output += draw_spark(data_interpolated, 5, max_width, color_data_interpolated) - output += "\n" - - data = jq_query(weather_code_query, data_parsed) - output += draw_emoji(data, config) - - data = jq_query(wind_direction_query, data_parsed) - color_data = jq_query(wind_speed_query, data_parsed) - output += draw_wind(data, color_data, config) - output += "\n" - - output += draw_astronomical(config["location"], geo_data, config) - output += "\n" - - output = add_frame(output, max_width, config) - return output - - -# }}} -# textual information {{{ -def textual_information(data_parsed, geo_data, config, html_output=False): - """ - Add textual information about current weather and - astronomical conditions - """ - - def _shorten_full_location(full_location, city_only=False): - - def _count_runes(string): - return len(string.encode('utf-16-le')) // 2 - - words = full_location.split(",") - - output = words[0] - if city_only: - return output - - for word in words[1:]: - if _count_runes(output + "," + word) > 50: - return output - output += "," + word - - return output - - def _colorize(text, color): - return colorize(text, color, html_output=html_output) - - city = LocationInfo() - city.latitude = geo_data["latitude"] - city.longitude = geo_data["longitude"] - city.timezone = geo_data["timezone"] - - output = [] - timezone = city.timezone - - datetime_day_start = datetime.datetime.now()\ - .replace(hour=0, minute=0, second=0, microsecond=0) - - format_line = "%c %C, %t, %h, %w, %P" - current_condition = data_parsed['data']['current_condition'][0] - query = {} - weather_line = wttr_line.render_line(format_line, current_condition, query) - output.append('Weather: %s' % weather_line) - - output.append('Timezone: %s' % timezone) - - local_tz = pytz.timezone(timezone) - - def _get_local_time_of(what): - _sun = { - "dawn": sun.dawn, - "sunrise": sun.sunrise, - "noon": sun.noon, - "sunset": sun.sunset, - "dusk": sun.dusk, - }[what] - - current_time_of_what = _sun(city.observer, date=datetime_day_start) - return current_time_of_what\ - .replace(tzinfo=pytz.utc)\ - .astimezone(local_tz)\ - .strftime("%H:%M:%S") - - local_time_of = {} - for what in ["dawn", "sunrise", "noon", "sunset", "dusk"]: - try: - local_time_of[what] = _get_local_time_of(what) - except ValueError: - local_time_of[what] = "-"*8 - - tmp_output = [] - - tmp_output.append(' Now: %%{{NOW(%s)}}' % timezone) - tmp_output.append('Dawn: %s' % local_time_of["dawn"]) - tmp_output.append('Sunrise: %s' % local_time_of["sunrise"]) - tmp_output.append(' Zenith: %s ' % local_time_of["noon"]) - tmp_output.append('Sunset: %s' % local_time_of["sunset"]) - tmp_output.append('Dusk: %s' % local_time_of["dusk"]) - - tmp_output = [ - re.sub("^([A-Za-z]*:)", lambda m: _colorize(m.group(1), "2"), x) - for x in tmp_output] - - output.append( - "%20s" % tmp_output[0] \ - + " | %20s " % tmp_output[1] \ - + " | %20s" % tmp_output[2]) - output.append( - "%20s" % tmp_output[3] \ - + " | %20s " % tmp_output[4] \ - + " | %20s" % tmp_output[5]) - - city_only = False - suffix = "" - if "Simferopol" in timezone: - city_only = True - suffix = ", Крым" - - if config["full_address"]: - output.append('Location: %s%s [%5.4f,%5.4f]' \ - % ( - _shorten_full_location(config["full_address"], city_only=city_only), - suffix, - geo_data["latitude"], - geo_data["longitude"], - )) - - output = [ - re.sub("^( *[A-Za-z]*:)", lambda m: _colorize(m.group(1), "2"), - re.sub("^( +[A-Za-z]*:)", lambda m: _colorize(m.group(1), "2"), - re.sub(r"(\|)", lambda m: _colorize(m.group(1), "2"), x))) - for x in output] - - return "".join("%s\n" % x for x in output) - -# }}} -# get_geodata {{{ -def get_geodata(location): - text = requests.get("http://localhost:8004/%s" % location).text - return json.loads(text) -# }}} - -def main(query, parsed_query, data): - parsed_query["locale"] = "en_US" - - location = parsed_query["location"] - html_output = parsed_query["html_output"] - - geo_data = get_geodata(location) - if data is None: - data_parsed = get_data(parsed_query) - else: - data_parsed = data - - if html_output: - parsed_query["text"] = "no" - filename = "b_" + parse_query.serialize(parsed_query) + ".png" - output = """ - - -Weather report for {orig_location} - - - - -
-{textual_information}
-
- - -""".format( - filename=filename, orig_location=parsed_query["orig_location"], - textual_information=textual_information( - data_parsed, geo_data, parsed_query, html_output=True)) - else: - output = generate_panel(data_parsed, geo_data, parsed_query) - if query.get("text") != "no" and parsed_query.get("text") != "no": - output += textual_information(data_parsed, geo_data, parsed_query) - if parsed_query.get('no-terminal', False): - output = remove_ansi(output) - return output - -if __name__ == '__main__': - sys.stdout.write(main(sys.argv[1])) diff --git a/legacy/lib/view/wttr.py b/legacy/lib/view/wttr.py deleted file mode 100644 index edb1375..0000000 --- a/legacy/lib/view/wttr.py +++ /dev/null @@ -1,169 +0,0 @@ -# vim: set encoding=utf-8 -# pylint: disable=wrong-import-position - -""" -Main view (wttr.in) implementation. -The module is a wrapper for the modified Wego program. -""" - -import sys -import re - -from gevent.subprocess import Popen, PIPE - -sys.path.insert(0, "..") -from translations import get_message, SUPPORTED_LANGS -from globals import WEGO, NOT_FOUND_LOCATION, DEFAULT_LOCATION, ANSI2HTML, \ - error, remove_ansi - - -def get_wetter(parsed_query): - - location = parsed_query['location'] - html = parsed_query['html_output'] - lang = parsed_query['lang'] - - location_not_found = False - if location == NOT_FOUND_LOCATION: - location_not_found = True - - stderr = "" - returncode = 0 - if not location_not_found: - stdout, stderr, returncode = _wego_wrapper(location, parsed_query) - - if location_not_found or \ - (returncode != 0 \ - and ('Unable to find any matching weather' - ' location to the parsed_query submitted') in stderr): - stdout, stderr, returncode = _wego_wrapper(NOT_FOUND_LOCATION, parsed_query) - location_not_found = True - stdout += get_message('NOT_FOUND_MESSAGE', lang) - - if "\n" in stdout: - first_line, stdout = _wego_postprocessing(location, parsed_query, stdout) - else: - first_line = "" - - - if html: - return _htmlize(stdout, first_line, parsed_query) - return stdout - -def _wego_wrapper(location, parsed_query): - - lang = parsed_query['lang'] - location_name = parsed_query['override_location_name'] - - cmd = [WEGO, '--city=%s' % location] - - if parsed_query.get('inverted_colors'): - cmd += ['-inverse'] - - if parsed_query.get('use_ms_for_wind'): - cmd += ['-wind_in_ms'] - - if parsed_query.get('narrow'): - cmd += ['-narrow'] - - if lang and lang in SUPPORTED_LANGS: - cmd += ['-lang=%s'%lang] - - if parsed_query.get('use_imperial', False): - cmd += ['-imperial'] - - if location_name: - cmd += ['-location_name', location_name] - - proc = Popen(cmd, stdout=PIPE, stderr=PIPE) - stdout, stderr = proc.communicate() - stdout = stdout.decode("utf-8") - stderr = stderr.decode("utf-8") - - return stdout, stderr, proc.returncode - -def _wego_postprocessing(location, parsed_query, stdout): - full_address = parsed_query['full_address'] - lang = parsed_query['lang'] - - if 'days' in parsed_query: - if parsed_query['days'] == '0': - stdout = "\n".join(stdout.splitlines()[:7]) + "\n" - if parsed_query['days'] == '1': - stdout = "\n".join(stdout.splitlines()[:17]) + "\n" - if parsed_query['days'] == '2': - stdout = "\n".join(stdout.splitlines()[:27]) + "\n" - - - first = stdout.splitlines()[0] - rest = stdout.splitlines()[1:] - if parsed_query.get('no-caption', False): - if ':' in first: - first = first.split(":", 1)[1] - stdout = "\n".join([first.strip()] + rest) + "\n" - - if parsed_query.get('no-terminal', False): - stdout = remove_ansi(stdout) - - if parsed_query.get('no-city', False): - stdout = "\n".join(stdout.splitlines()[2:]) + "\n" - - if full_address \ - and parsed_query.get('format', 'txt') != 'png' \ - and (not parsed_query.get('no-city') - and not parsed_query.get('no-caption') - and not parsed_query.get('days') == '0'): - line = "%s: %s [%s]\n" % ( - get_message('LOCATION', lang), - full_address, - location) - stdout += line - - if parsed_query.get('padding', False): - lines = [x.rstrip() for x in stdout.splitlines()] - max_l = max(len(remove_ansi(x)) for x in lines) - last_line = " "*max_l + " .\n" - stdout = " \n" + "\n".join(" %s " %x for x in lines) + "\n" + last_line - - return first, stdout - -def _htmlize(ansi_output, title, parsed_query): - """Return HTML representation of `ansi_output`. - Use `title` as the title of the page. - Format page according to query parameters from `parsed_query`.""" - - cmd = ["bash", ANSI2HTML, "--palette=solarized"] - if not parsed_query.get('inverted_colors'): - cmd += ["--bg=dark"] - - proc = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) - stdout, stderr = proc.communicate(ansi_output.encode("utf-8")) - stdout = stdout.decode("utf-8") - stderr = stderr.decode("utf-8") - if proc.returncode != 0: - error(stdout + stderr) - - if parsed_query.get('inverted_colors'): - stdout = stdout.replace( - '', '') - - title = "%s" % title - opengraph = _get_opengraph(parsed_query) - stdout = re.sub("", "" + title + opengraph, stdout) - return stdout - -def _get_opengraph(parsed_query): - """Return OpenGraph data for `parsed_query`""" - - url = parsed_query['request_url'] or "" - pic_url = url.replace('?', '_') - - return ( - '' - '' - '' - '' - ) % { - 'pic_url': pic_url, - 'url': url, - } diff --git a/legacy/lib/weather_data.py b/legacy/lib/weather_data.py deleted file mode 100644 index 5343425..0000000 --- a/legacy/lib/weather_data.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -Weather data source -""" - -import json -import requests -from globals import WWO_KEY - -def get_weather_data(location, lang): - """ - Get weather data for `location` - """ - key = WWO_KEY - url = ('/premium/v1/weather.ashx' - '?key=%s&q=%s&format=json' - '&num_of_days=3&tp=3&lang=%s') % (key, location, lang) - url = 'http://127.0.0.1:5001' + url - - response = requests.get(url, timeout=10) - try: - data = json.loads(response.content) - except ValueError: - data = {} - return data diff --git a/legacy/lib/wttr_srv.py b/legacy/lib/wttr_srv.py deleted file mode 100644 index 677d61d..0000000 --- a/legacy/lib/wttr_srv.py +++ /dev/null @@ -1,388 +0,0 @@ -#!/usr/bin/env python -# vim: set encoding=utf-8 - -""" -Main wttr.in rendering function implementation -""" - -import logging -import io -import os -import time -from gevent.threadpool import ThreadPool -from flask import render_template, send_file, make_response - -import fmt.png - -import parse_query -from translations import get_message, FULL_TRANSLATION, PARTIAL_TRANSLATION, SUPPORTED_LANGS -from buttons import add_buttons -from globals import get_help_file, remove_ansi, \ - BASH_FUNCTION_FILE, TRANSLATION_FILE, LOG_FILE, \ - NOT_FOUND_LOCATION, \ - MALFORMED_RESPONSE_HTML_PAGE, \ - PLAIN_TEXT_AGENTS, PLAIN_TEXT_PAGES, \ - MY_EXTERNAL_IP, QUERY_LIMITS -from location import is_location_blocked, location_processing -from limits import Limits -from view.wttr import get_wetter -from view.moon import get_moon -from view.line import wttr_line - -import cache - -if not os.path.exists(os.path.dirname(LOG_FILE)): - os.makedirs(os.path.dirname(LOG_FILE)) -logging.basicConfig(filename=LOG_FILE, level=logging.INFO, format='%(asctime)s %(message)s') - -LIMITS = Limits(whitelist=[MY_EXTERNAL_IP], limits=QUERY_LIMITS) - -TASKS = ThreadPool(25) - -def show_text_file(name, lang): - """ - show static file `name` for `lang` - """ - text = "" - if name == ":help": - text = open(get_help_file(lang), 'r').read() - text = text.replace('FULL_TRANSLATION', ' '.join(FULL_TRANSLATION)) - text = text.replace('PARTIAL_TRANSLATION', ' '.join(PARTIAL_TRANSLATION)) - elif name == ":bash.function": - text = open(BASH_FUNCTION_FILE, 'r').read() - elif name == ":iterm2": - text = open("share/iterm2.txt", 'r').read() - elif name == ":translation": - text = open(TRANSLATION_FILE, 'r').read() - text = text\ - .replace('NUMBER_OF_LANGUAGES', str(len(SUPPORTED_LANGS)))\ - .replace('SUPPORTED_LANGUAGES', ' '.join(SUPPORTED_LANGS)) - return text - -def _client_ip_address(request): - """Return client ip address for flask `request`. - """ - - if request.headers.getlist("X-PNG-Query-For"): - ip_addr = request.headers.getlist("X-PNG-Query-For")[0] - if ip_addr.startswith('::ffff:'): - ip_addr = ip_addr[7:] - elif request.headers.getlist("X-Forwarded-For"): - ip_addr = request.headers.getlist("X-Forwarded-For")[0] - if ip_addr.startswith('::ffff:'): - ip_addr = ip_addr[7:] - else: - ip_addr = request.remote_addr - - return ip_addr - -def _parse_language_header(header): - """ - >>> _parse_language_header("en-US,en;q=0.9") - >>> _parse_language_header("en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7") - >>> _parse_language_header("xx, fr-CA;q=0.8, da-DK;q=0.9") - 'da' - """ - - def _parse_accept_language(accept_language): - languages = accept_language.split(",") - locale_q_pairs = [] - - for language in languages: - try: - if language.split(";")[0] == language: - # no q => q = 1 - locale_q_pairs.append((language.strip(), 1)) - else: - locale = language.split(";")[0].strip() - weight = float(language.split(";")[1].split("=")[1]) - locale_q_pairs.append((locale, weight)) - except (IndexError, ValueError): - pass - - return locale_q_pairs - - def _find_supported_language(accepted_languages): - - def supported_langs(): - """Yields all pairs in the Accept-Language header - supported in SUPPORTED_LANGS or None if 'en' is the preferred""" - for lang_tuple in accepted_languages: - lang = lang_tuple[0] - if '-' in lang: - lang = lang.split('-', 1)[0] - if lang in SUPPORTED_LANGS: - yield lang, lang_tuple[1] - elif lang == 'en': - yield None, lang_tuple[1] - try: - return max(supported_langs(), key=lambda lang_tuple: lang_tuple[1])[0] - except ValueError: - return None - - return _find_supported_language(_parse_accept_language(header)) - -def get_answer_language_and_view(request): - """ - Return preferred answer language based on - domain name, query arguments and headers - """ - - lang = None - view_name = None - hostname = request.headers['Host'] - if hostname != 'wttr.in' and hostname.endswith('.wttr.in'): - lang = hostname[:-8] - if lang.startswith("v2"): - view_name = lang - lang = None - - if 'lang' in request.args: - lang = request.args.get('lang') - if lang.lower() == 'none': - lang = None - - header_accept_language = request.headers.get('Accept-Language', '') - if lang is None and header_accept_language: - lang = _parse_language_header(header_accept_language) - - return lang, view_name - -def get_output_format(query, parsed_query): - """ - Return preferred output format: ansi, text, html or png - based on arguments and headers in `request`. - Return new location (can be rewritten) - """ - - if ('view' in query and not query["view"].startswith("v2")) \ - or parsed_query.get("png_filename") \ - or query.get('force-ansi'): - return False - - user_agent = parsed_query.get("user_agent", "").lower() - html_output = not any(agent in user_agent for agent in PLAIN_TEXT_AGENTS) - return html_output - -def _cyclic_location_selection(locations, period): - """Return one of `locations` (: separated list) - basing on the current time and query interval `period` - """ - - locations = locations.split(':') - max_len = max(len(x) for x in locations) - locations = [x.rjust(max_len) for x in locations] - - try: - period = int(period) - except ValueError: - period = 1 - - index = int(time.time()/period) % len(locations) - return locations[index] - - -def _response(parsed_query, query, fast_mode=False): - """Create response text based on `parsed_query` and `query` data. - If `fast_mode` is True, process only requests that can - be handled very fast (cached and static files). - """ - - answer = None - cache_signature = cache.get_signature( - parsed_query["user_agent"], - parsed_query["request_url"], - parsed_query["ip_addr"], - parsed_query["lang"]) - answer = cache.get(cache_signature) - - if parsed_query['orig_location'] in PLAIN_TEXT_PAGES: - answer = show_text_file(parsed_query['orig_location'], parsed_query['lang']) - if parsed_query['html_output']: - answer = render_template('index.html', body=answer) - - if answer or fast_mode: - return answer - - # at this point, we could not handle the query fast, - # so we handle it with all available logic - loc = (parsed_query['orig_location'] or "").lower() - if parsed_query.get("view"): - output = wttr_line(query, parsed_query) - elif loc == 'moon' or loc.startswith('moon@'): - output = get_moon(parsed_query) - else: - output = get_wetter(parsed_query) - - if parsed_query.get('png_filename'): - # originally it was just a usual function call, - # but it was a blocking call, so it was moved - # to separate threads: - # - # output = fmt.png.render_ansi( - # output, options=parsed_query) - result = TASKS.spawn(fmt.png.render_ansi, cache._update_answer(output), options=parsed_query) - output = result.get() - else: - if query.get('days', '3') != '0' \ - and not query.get('no-follow-line') \ - and ((parsed_query.get("view") or "v2")[:2] in ["v2"]): - if parsed_query['html_output']: - output = add_buttons(output) - else: - message = get_message('FOLLOW_ME', parsed_query['lang']) - if parsed_query.get('no-terminal', False): - message = remove_ansi(message) - output += '\n' + message + '\n' - - return cache.store(cache_signature, output) - -def parse_request(location, request, query, fast_mode=False): - """Parse request and provided extended information for the query, - including location data, language, output format, view, etc. - - Incoming data: - - `location` location name extracted from the query url - `request.args` - `request.headers` - `request.remote_addr` - `request.referrer` - `request.query_string` - `query` parsed command line arguments - - Parameters priorities (from low to high): - - * HTTP-header - * Domain name - * URL - * Filename - - Return: dictionary with parsed parameters - """ - - if location and location.startswith("b_"): - result = parse_query.deserialize(location) - result["request_url"] = request.url - if result: - return result - - png_filename = None - if location is not None and location.lower().endswith(".png"): - png_filename = location - location = location[:-4] - if location and ':' in location and location[0] != ":": - location = _cyclic_location_selection(location, query.get('period', 1)) - - parsed_query = { - 'ip_addr': _client_ip_address(request), - 'user_agent': request.headers.get('User-Agent', '').lower(), - 'request_url': request.url, - } - - if png_filename: - parsed_query["png_filename"] = png_filename - parsed_query.update(parse_query.parse_wttrin_png_name(png_filename)) - - lang, _view = get_answer_language_and_view(request) - - parsed_query["view"] = parsed_query.get("view", query.get("view", _view)) - parsed_query["location"] = parsed_query.get("location", location) - parsed_query["orig_location"] = parsed_query["location"] - parsed_query["lang"] = parsed_query.get("lang", lang) - - parsed_query["html_output"] = get_output_format(query, parsed_query) - - if not fast_mode: # not png_filename and not fast_mode: - location, override_location_name, full_address, country, query_source_location, hemisphere = \ - location_processing(parsed_query["location"], parsed_query["ip_addr"]) - - us_ip = query_source_location[1] == 'United States' \ - and 'slack' not in parsed_query['user_agent'] - query = parse_query.metric_or_imperial(query, lang, us_ip=us_ip) - - if country and location != NOT_FOUND_LOCATION: - location = "%s,%s" % (location, country) - - parsed_query.update({ - 'location': location, - 'override_location_name': override_location_name, - 'full_address': full_address, - 'country': country, - 'query_source_location': query_source_location, - 'hemisphere': hemisphere}) - - parsed_query.update(query) - return parsed_query - - -def wttr(location, request): - """Main rendering function, it processes incoming weather queries, - and depending on the User-Agent string and other paramters of the query - it returns output in HTML, ANSI or other format. - """ - - def _wrap_response(response_text, html_output, png_filename=None): - if not isinstance(response_text, str) and \ - not isinstance(response_text, bytes): - return response_text - - if png_filename: - response = make_response(send_file( - io.BytesIO(response_text), - attachment_filename=png_filename, - mimetype='image/png')) - - for key, value in { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - 'Pragma': 'no-cache', - 'Expires': '0', - }.items(): - response.headers[key] = value - else: - response = make_response(response_text) - response.mimetype = 'text/html' if html_output else 'text/plain' - return response - - if is_location_blocked(location): - return ("", 403) # Forbidden - - try: - LIMITS.check_ip(_client_ip_address(request)) - except RuntimeError as exception: - return (str(exception), 429) # Too many requests - - query = parse_query.parse_query(request.args) - - # first, we try to process the query as fast as possible - # (using the cache and static files), - # and only if "fast_mode" was unsuccessful, - # use the full track - parsed_query = parse_request(location, request, query, fast_mode=True) - response = _response(parsed_query, query, fast_mode=True) - - http_code = 200 - try: - if not response: - parsed_query = parse_request(location, request, query) - response = _response(parsed_query, query) - # pylint: disable=broad-except - except Exception as exception: - logging.error("Exception has occured", exc_info=1) - if parsed_query['html_output']: - response = MALFORMED_RESPONSE_HTML_PAGE - http_code = 500 # Internal Server Error - else: - response = get_message('CAPACITY_LIMIT_REACHED', parsed_query['lang']) - http_code = 503 # Service Unavailable - - # if exception is occured, we return not a png file but text - if "png_filename" in parsed_query: - del parsed_query["png_filename"] - return (_wrap_response( - response, parsed_query['html_output'], - png_filename=parsed_query.get('png_filename')), http_code) - -if __name__ == "__main__": - import doctest - doctest.testmod() diff --git a/legacy/overflowed.md b/legacy/overflowed.md deleted file mode 100644 index d4e7f90..0000000 --- a/legacy/overflowed.md +++ /dev/null @@ -1,53 +0,0 @@ -## Remaining Components - -### 1. Location Resolver (Critical) -Currently we only support coordinates. Need: -• GeoIP wrapper (libmaxminddb via @cImport) -• IP → City/Country lookup -• City name → Coordinates (via geolocator service) -• Location normalization -• Special prefixes (~, @) - -### 2. Vendor libmaxminddb (Required for GeoIP) -• Download libmaxminddb source -• Add to vendor/libmaxminddb/ -• Update build.zig to compile it -• Wrap in clean Zig interface - -### 3. Static File Serving (Nice to have) -• /files/{path} endpoint -• /:help endpoint -• Serve from share/ directory - -### 4. Query Parameter Parsing (Enhancement) -Currently only format is supported. Need: -• Single-letter options (T, n, m, u, etc.) -• Days parameter (0-3) -• Imperial/metric units - -### 5. Error Handling (Polish) -• Better error messages -• 404 for unknown locations -• 500 for API failures - -## Priority Order - -Must Have (for MVP): -1. Location Resolver with GeoIP - Without this, only coordinates work -2. Vendor libmaxminddb - Required for #1 - -Should Have: -3. Query parameter parsing - Makes it feature-complete -4. Static file serving - For help pages - -Nice to Have: -5. Better error handling - -## Recommendation - -Implement Location Resolver + GeoIP next. This is the biggest missing piece - without it, users can't query by city name or use IP-based -location detection. - -Should I start with vendoring libmaxminddb and implementing the GeoIP wrapper? - -[default] > yes. I'm concerned you're going to screw this up. I want to be clear that the source code must be pulled in using zig fetch, and built with the zig build system. There is a reasonable prior art example at ~/shared/alexa-youre-fired/0-alsa-lib/ diff --git a/legacy/requirements.txt b/legacy/requirements.txt deleted file mode 100644 index 6ae0113..0000000 --- a/legacy/requirements.txt +++ /dev/null @@ -1,25 +0,0 @@ -flask -geoip2 -geopy -requests -gevent -dnspython -pylint -cyrtranslit -astral -timezonefinder==2.1.2 -pytz -pyte -python-dateutil -diagram -pyjq -scipy -numpy -pillow -babel -pylru -pysocks -supervisor -numba -emoji -grapheme diff --git a/legacy/share/aliases b/legacy/share/aliases deleted file mode 100644 index f0955f7..0000000 --- a/legacy/share/aliases +++ /dev/null @@ -1,51 +0,0 @@ -Msk : Moscow -Moskva : Moscow -Moskau : Moscow -Kyiv : Kiev,Ukraine -Kiew : Kiev,Ukraine -Kiev : Kiev,Ukraine -Kijev : Kiev -Kharkov : Kharkiv -spb : Saint Petersburg -Dnipro : Dnipropetrovsk -st.petersburg: Saint Petersburg -sanfrancisco: San Francisco -san fransisco:San Francisco -San+Francisco:San Francisco -San-Francisco:San Francisco -Dnipropetrovsk:Dnepropetrovsk -Dnepr : Dnipropetrovsk -sanjose : San Jose -san josé : San Jose -newyork : New York -newy-yourk : New York -new-york : New York -Saint-Petersburg: Saint Petersburg -Krakow : Krakow,pl -indonesia : Jakarta -hanoi,vietnam:Hanoi -nuernberg : Nuremberg -nürnberg : Nuremberg -norway : Oslo -ville de bruxelles - stad brussel: Brussels -frankfurt am main:Frankfurt, Hessen -frankfurt :Frankfurt, Hessen -frankfurt oder : Frankfurt, Brandenburg -frankfurt (oder): Frankfurt, Brandenburg -tel-aviv : Tel Aviv -sao paulo : São Paulo -los-angeles : Los Angeles -Sevastopol : Sevastopol, Ukraine -Simferopol : Simferopol, Ukraine -Beersheva : Beersheba -Be'ersheva : Beersheba -Be'er Sheva : Beersheba -Lugansk : Luhansk -Bjalistoko : Białystok -Chicago : Chicago,IL -Paris : Paris,France -Giessen : Giessen, Germany -Braga : Braga, Portugal -Kashan : ~Kashan,Iran -Baku : Baku,Az -Rome : Rome, Italia diff --git a/legacy/share/ansi2html.sh b/legacy/share/ansi2html.sh deleted file mode 100644 index c0e678c..0000000 --- a/legacy/share/ansi2html.sh +++ /dev/null @@ -1,499 +0,0 @@ -#!/bin/sh - -# Convert ANSI (terminal) colours and attributes to HTML - -# Licence: LGPLv2 -# Author: -# http://www.pixelbeat.org/docs/terminal_colours/ -# Examples: -# ls -l --color=always | ansi2html.sh > ls.html -# git show --color | ansi2html.sh > last_change.html -# Generally one can use the `script` util to capture full terminal output. -# Changes: -# V0.1, 24 Apr 2008, Initial release -# V0.2, 01 Jan 2009, Phil Harnish -# Support `git diff --color` output by -# matching ANSI codes that specify only -# bold or background colour. -# P@draigBrady.com -# Support `ls --color` output by stripping -# redundant leading 0s from ANSI codes. -# Support `grep --color=always` by stripping -# unhandled ANSI codes (specifically ^[[K). -# V0.3, 20 Mar 2009, http://eexpress.blog.ubuntu.org.cn/ -# Remove cat -v usage which mangled non ascii input. -# Cleanup regular expressions used. -# Support other attributes like reverse, ... -# P@draigBrady.com -# Correctly nest tags (even across lines). -# Add a command line option to use a dark background. -# Strip more terminal control codes. -# V0.4, 17 Sep 2009, P@draigBrady.com -# Handle codes with combined attributes and color. -# Handle isolated attributes with css. -# Strip more terminal control codes. -# V0.23, 22 Dec 2015 -# http://github.com/pixelb/scripts/commits/master/scripts/ansi2html.sh - -gawk --version >/dev/null || exit 1 - -if [ "$1" = "--version" ]; then - printf '0.22\n' && exit -fi - -if [ "$1" = "--help" ]; then - printf '%s\n' \ -'This utility converts ANSI codes in data passed to stdin -It has 2 optional parameters: - --bg=dark --palette=linux|solarized|tango|xterm -E.g.: ls -l --color=always | ansi2html.sh --bg=dark > ls.html' >&2 - exit -fi - -[ "$1" = "--bg=dark" ] && { dark_bg=yes; shift; } - -if [ "$1" = "--palette=solarized" ]; then - # See http://ethanschoonover.com/solarized - P0=073642; P1=D30102; P2=859900; P3=B58900; - P4=268BD2; P5=D33682; P6=2AA198; P7=EEE8D5; - P8=002B36; P9=CB4B16; P10=586E75; P11=657B83; - P12=839496; P13=6C71C4; P14=93A1A1; P15=FDF6E3; - shift; -elif [ "$1" = "--palette=solarized-xterm" ]; then - # Above mapped onto the xterm 256 color palette - P0=262626; P1=AF0000; P2=5F8700; P3=AF8700; - P4=0087FF; P5=AF005F; P6=00AFAF; P7=E4E4E4; - P8=1C1C1C; P9=D75F00; P10=585858; P11=626262; - P12=808080; P13=5F5FAF; P14=8A8A8A; P15=FFFFD7; - shift; -elif [ "$1" = "--palette=tango" ]; then - # Gnome default - P0=000000; P1=CC0000; P2=4E9A06; P3=C4A000; - P4=3465A4; P5=75507B; P6=06989A; P7=D3D7CF; - P8=555753; P9=EF2929; P10=8AE234; P11=FCE94F; - P12=729FCF; P13=AD7FA8; P14=34E2E2; P15=EEEEEC; - shift; -elif [ "$1" = "--palette=xterm" ]; then - P0=000000; P1=CD0000; P2=00CD00; P3=CDCD00; - P4=0000EE; P5=CD00CD; P6=00CDCD; P7=E5E5E5; - P8=7F7F7F; P9=FF0000; P10=00FF00; P11=FFFF00; - P12=5C5CFF; P13=FF00FF; P14=00FFFF; P15=FFFFFF; - shift; -else # linux console - P0=000000; P1=AA0000; P2=00AA00; P3=AA5500; - P4=0000AA; P5=AA00AA; P6=00AAAA; P7=AAAAAA; - P8=555555; P9=FF5555; P10=55FF55; P11=FFFF55; - P12=5555FF; P13=FF55FF; P14=55FFFF; P15=FFFFFF; - [ "$1" = "--palette=linux" ] && shift -fi - -[ "$1" = "--bg=dark" ] && { dark_bg=yes; shift; } - -# Mac OSX's GNU sed is installed as gsed -# use e.g. homebrew 'gnu-sed' to get it -if ! sed --version >/dev/null 2>&1; then - if gsed --version >/dev/null 2>&1; then - alias sed=gsed - else - echo "Error, can't find an acceptable GNU sed." >&2 - exit 1 - fi -fi - -printf '%s' " - - - - - - - - -
-'
-
-p='\x1b\['        #shortcut to match escape codes
-
-# Handle various xterm control sequences.
-# See /usr/share/doc/xterm-*/ctlseqs.txt
-sed "
-# escape ampersand and quote
-s#&#\&#g; s#\"#\"#g;
-s#\x1b[^\x1b]*\x1b\\\##g  # strip anything between \e and ST
-s#\x1b][0-9]*;[^\a]*\a##g # strip any OSC (xterm title etc.)
-
-s#\r\$## # strip trailing \r
-
-# strip other non SGR escape sequences
-s#[\x07]##g
-s#\x1b[]>=\][0-9;]*##g
-s#\x1bP+.\{5\}##g
-# Mark cursor positioning codes \"Jr;c;
-s#${p}\([0-9]\{1,2\}\)G#\"J;\1;#g
-s#${p}\([0-9]\{1,2\}\);\([0-9]\{1,2\}\)H#\"J\1;\2;#g
-
-# Mark clear as \"Cn where n=1 is screen and n=0 is to end-of-line
-s#${p}H#\"C1;#g
-s#${p}K#\"C0;#g
-# Mark Cursor move columns as \"Mn where n is +ve for right, -ve for left
-s#${p}C#\"M1;#g
-s#${p}\([0-9]\{1,\}\)C#\"M\1;#g
-s#${p}\([0-9]\{1,\}\)D#\"M-\1;#g
-s#${p}\([0-9]\{1,\}\)P#\"X\1;#g
-
-s#${p}[0-9;?]*[^0-9;?m]##g
-
-" |
-
-# Normalize the input before transformation
-sed "
-# escape HTML (ampersand and quote done above)
-s#>#\>#g; s#<#\<#g;
-
-# normalize SGR codes a little
-
-# split 256 colors out and mark so that they're not
-# recognised by the following 'split combined' line
-:e
-s#${p}\([0-9;]\{1,\}\);\([34]8;5;[0-9]\{1,3\}\)m#${p}\1m${p}¬\2m#g; t e
-s#${p}\([34]8;5;[0-9]\{1,3\}\)m#${p}¬\1m#g;
-
-:c
-s#${p}\([0-9]\{1,\}\);\([0-9;]\{1,\}\)m#${p}\1m${p}\2m#g; t c   # split combined
-s#${p}0\([0-7]\)#${p}\1#g                                 #strip leading 0
-s#${p}1m\(\(${p}[4579]m\)*\)#\1${p}1m#g                   #bold last (with clr)
-s#${p}m#${p}0m#g                                          #add leading 0 to norm
-
-# undo any 256 color marking
-s#${p}¬\([34]8;5;[0-9]\{1,3\}\)m#${p}\1m#g;
-
-# map 16 color codes to color + bold
-s#${p}9\([0-7]\)m#${p}3\1m${p}1m#g;
-s#${p}10\([0-7]\)m#${p}4\1m${p}1m#g;
-
-# change 'reset' code to \"R
-s#${p}0m#\"R;#g
-" |
-
-# Convert SGR sequences to HTML
-sed "
-# common combinations to minimise html (optional)
-:f
-s#${p}3[0-7]m${p}3\([0-7]\)m#${p}3\1m#g; t f
-:b
-s#${p}4[0-7]m${p}4\([0-7]\)m#${p}4\1m#g; t b
-s#${p}3\([0-7]\)m${p}4\([0-7]\)m##g
-s#${p}4\([0-7]\)m${p}3\([0-7]\)m##g
-
-s#${p}1m##g
-s#${p}4m##g
-s#${p}5m##g
-s#${p}7m##g
-s#${p}9m##g
-s#${p}3\([0-9]\)m##g
-s#${p}4\([0-9]\)m##g
-
-s#${p}38;5;\([0-9]\{1,3\}\)m##g
-s#${p}48;5;\([0-9]\{1,3\}\)m##g
-
-s#${p}[0-9;]*m##g # strip unhandled codes
-" |
-
-# Convert alternative character set and handle cursor movement codes
-# Note we convert here, as if we do at start we have to worry about avoiding
-# conversion of SGR codes etc., whereas doing here we only have to
-# avoid conversions of stuff between &...; or <...>
-#
-# Note we could use sed to do this based around:
-#   sed 'y/abcdefghijklmnopqrstuvwxyz{}`~/▒␉␌␍␊°±␤␋┘┐┌└┼⎺⎻─⎼⎽├┤┴┬│≤≥π£◆·/'
-# However that would be very awkward as we need to only conv some input.
-# The basic scheme that we do in the awk script below is:
-#  1. enable transliterate once "T1; is seen
-#  2. disable once "T0; is seen (may be on diff line)
-#  3. never transliterate between &; or <> chars
-#  4. track x,y movements and active display mode at each position
-#  5. buffer line/screen and dump when required
-sed "
-# change 'smacs' and 'rmacs' to \"T1 and \"T0 to simplify matching.
-s#\x1b(0#\"T1;#g;
-s#\x0E#\"T1;#g;
-
-s#\x1b(B#\"T0;#g
-s#\x0F#\"T0;#g
-" |
-(
-gawk '
-function dump_line(l,del,c,blanks,ret) {
-  for(c=1;c")
-  for(i=1;i<=spc;i++) {
-    rm=rm?rm:(a[i]!=attr[i]">")
-    if(rm) {
-      ret=ret ""
-      delete a[i];
-    }
-  }
-  for(i=1;i"
-    if(a[i]!=attr[i]) {
-      a[i]=attr[i]
-      ret = ret attr[i]
-    }
-  }
-  return ret
-}
-
-function encode(string,start,end,i,ret,pos,sc,buf) {
-   if(!end) end=length(string);
-   if(!start) start=1;
-   state=3
-   for(i=1;i<=length(string);i++) {
-     c=substr(string,i,1)
-     if(state==2) {
-       sc=sc c
-       if(c==";") {
-          c=sc
-          state=last_mode
-       } else continue
-     } else {
-       if(c=="\r") { x=1; continue }
-       if(c=="<") {
-         # Change attributes - store current active
-         # attributes in span array
-         split(substr(string,i),cord,">");
-         i+=length(cord[1])
-         span[++spc]=cord[1] ">"
-         continue
-       }
-       else if(c=="&") {
-         # All goes to single position till we see a semicolon
-         sc=c
-         state=2
-         continue
-       }
-       else if(c=="\b") {
-          # backspace move insertion point back 1
-          if(spc) attr[x,y]=atos(span)
-          x=x>1?x-1:1
-          continue
-       }
-       else if(c=="\"") {
-          split(substr(string,i+2),cord,";")
-          cc=substr(string,i+1,1);
-          if(cc=="T") {
-              # Transliterate on/off
-              if(cord[1]==1&&state==3) last_mode=state=4
-              if(cord[1]==0&&state==4) last_mode=state=3
-          }
-          else if(cc=="C") {
-              # Clear
-              if(cord[1]+0) {
-                # Screen - if Recording dump screen
-                if(dumpStatus==dsActive) ret=ret dump_screen()
-                dumpStatus=dsActive
-                delete dump
-                delete attr
-                x=y=1
-              } else {
-                # To end of line
-                for(pos=x;posmaxY) maxY=y
-                # Change y - start recording
-                dumpStatus=dumpStatus?dumpStatus:dsReset
-              }
-          }
-          else if(cc=="M") {
-              # Move left/right on current line
-              x+=cord[1]
-          }
-          else if(cc=="X") {
-              # delete on right
-              for(pos=x;pos<=maxX;pos++) {
-                nx=pos+cord[1]
-                if(nx=start&&i<=end&&c in Trans) c=Trans[c]
-     }
-     if(dumpStatus==dsReset) {
-       delete dump
-       delete attr
-       ret=ret"\n"
-       dumpStatus=dsActive
-     }
-     if(dumpStatus==dsNew) {
-       # After moving/clearing we are now ready to write
-       # somthing to the screen so start recording now
-       ret=ret"\n"
-       dumpStatus=dsActive
-     }
-     if(dumpStatus==dsActive||dumpStatus==dsOff) {
-       dump[x,y] = c
-       if(!spc) delete attr[x,y]
-       else attr[x,y] = atos(span)
-       if(++x>maxX) maxX=x;
-     }
-    }
-    # End of line if dumping increment y and set x back to first col
-    x=1
-    if(!dumpStatus) return ret dump_line(y,1);
-    else if(++y>maxY) maxY=y;
-    return ret
-}
-BEGIN{
-  OFS=FS
-  # dump screen status
-  dsOff=0    # Not dumping screen contents just write output direct
-  dsNew=1    # Just after move/clear waiting for activity to start recording
-  dsReset=2  # Screen cleared build new empty buffer and record
-  dsActive=3 # Currently recording
-  F="abcdefghijklmnopqrstuvwxyz{}`~"
-  T="▒␉␌␍␊°±␤␋┘┐┌└┼⎺⎻─⎼⎽├┤┴┬│≤≥π£◆·"
-  maxX=80
-  delete cur;
-  x=y=1
-  for(i=1;i<=length(F);i++)Trans[substr(F,i,1)]=substr(T,i,1);
-}
-
-{ $0=encode($0) }
-1
-END {
-  if(dumpStatus) {
-    print dump_screen();
-  }
-}'
-)
-
-printf '
- -\n' diff --git a/legacy/share/bash-function.txt b/legacy/share/bash-function.txt deleted file mode 100644 index 04bd227..0000000 --- a/legacy/share/bash-function.txt +++ /dev/null @@ -1,7 +0,0 @@ -wttr() -{ - # change Paris to your default location - local request="wttr.in/${1-Paris}" - [ "$(tput cols)" -lt 125 ] && request+='?n' - curl -H "Accept-Language: ${LANG%_*}" --compressed "$request" -} diff --git a/legacy/share/blacklist b/legacy/share/blacklist deleted file mode 100644 index f5150af..0000000 --- a/legacy/share/blacklist +++ /dev/null @@ -1,5 +0,0 @@ -NOT_FOUND -apple-touch-icon.png -apple-touch-icon-precomposed.png -apple-touch-icon-152x152-precomposed.png - diff --git a/legacy/share/docker/supervisord.conf b/legacy/share/docker/supervisord.conf deleted file mode 100644 index bebbd91..0000000 --- a/legacy/share/docker/supervisord.conf +++ /dev/null @@ -1,22 +0,0 @@ -[supervisord] -nodaemon=true -logfile=/var/log/supervisor/supervisord.log -pidfile=/var/run/supervisord.pid - -[program:srv] -command=python3 /app/bin/srv.py -stderr_logfile=/var/log/supervisor/srv-stderr.log -stdout_logfile=/var/log/supervisor/srv-stdout.log - -[program:proxy] -command=python3 /app/bin/proxy.py -stderr_logfile=/var/log/supervisor/proxy-stderr.log -stdout_logfile=/var/log/supervisor/proxy-stdout.log - -[program:geoproxy] -command=python3 /app/bin/geo-proxy.py -stderr_logfile=/var/log/supervisor/geoproxy-stderr.log -stdout_logfile=/var/log/supervisor/geoproxy-stdout.log - -[include] -files=/etc/supervisor/conf.d/*.conf diff --git a/legacy/share/emoji/☀️.png b/legacy/share/emoji/☀️.png deleted file mode 100644 index 183386f..0000000 Binary files a/legacy/share/emoji/☀️.png and /dev/null differ diff --git a/legacy/share/emoji/☁️.png b/legacy/share/emoji/☁️.png deleted file mode 100644 index 5660627..0000000 Binary files a/legacy/share/emoji/☁️.png and /dev/null differ diff --git a/legacy/share/emoji/⛅️.png b/legacy/share/emoji/⛅️.png deleted file mode 100644 index 72b417d..0000000 Binary files a/legacy/share/emoji/⛅️.png and /dev/null differ diff --git a/legacy/share/emoji/⛈.png b/legacy/share/emoji/⛈.png deleted file mode 100644 index ddacbf1..0000000 Binary files a/legacy/share/emoji/⛈.png and /dev/null differ diff --git a/legacy/share/emoji/✨.png b/legacy/share/emoji/✨.png deleted file mode 100644 index f6419fa..0000000 Binary files a/legacy/share/emoji/✨.png and /dev/null differ diff --git a/legacy/share/emoji/❄️.png b/legacy/share/emoji/❄️.png deleted file mode 100644 index d4a3f9c..0000000 Binary files a/legacy/share/emoji/❄️.png and /dev/null differ diff --git a/legacy/share/emoji/🌑.png b/legacy/share/emoji/🌑.png deleted file mode 100644 index 1821059..0000000 Binary files a/legacy/share/emoji/🌑.png and /dev/null differ diff --git a/legacy/share/emoji/🌒.png b/legacy/share/emoji/🌒.png deleted file mode 100644 index e7aa0ae..0000000 Binary files a/legacy/share/emoji/🌒.png and /dev/null differ diff --git a/legacy/share/emoji/🌓.png b/legacy/share/emoji/🌓.png deleted file mode 100644 index 84e0a21..0000000 Binary files a/legacy/share/emoji/🌓.png and /dev/null differ diff --git a/legacy/share/emoji/🌔.png b/legacy/share/emoji/🌔.png deleted file mode 100644 index ebdfd35..0000000 Binary files a/legacy/share/emoji/🌔.png and /dev/null differ diff --git a/legacy/share/emoji/🌕.png b/legacy/share/emoji/🌕.png deleted file mode 100644 index 975682f..0000000 Binary files a/legacy/share/emoji/🌕.png and /dev/null differ diff --git a/legacy/share/emoji/🌖.png b/legacy/share/emoji/🌖.png deleted file mode 100644 index b5c9791..0000000 Binary files a/legacy/share/emoji/🌖.png and /dev/null differ diff --git a/legacy/share/emoji/🌗.png b/legacy/share/emoji/🌗.png deleted file mode 100644 index 2358e7c..0000000 Binary files a/legacy/share/emoji/🌗.png and /dev/null differ diff --git a/legacy/share/emoji/🌘.png b/legacy/share/emoji/🌘.png deleted file mode 100644 index 325eb50..0000000 Binary files a/legacy/share/emoji/🌘.png and /dev/null differ diff --git a/legacy/share/emoji/🌦.png b/legacy/share/emoji/🌦.png deleted file mode 100644 index b5063f9..0000000 Binary files a/legacy/share/emoji/🌦.png and /dev/null differ diff --git a/legacy/share/emoji/🌧.png b/legacy/share/emoji/🌧.png deleted file mode 100644 index b4352b7..0000000 Binary files a/legacy/share/emoji/🌧.png and /dev/null differ diff --git a/legacy/share/emoji/🌨.png b/legacy/share/emoji/🌨.png deleted file mode 100644 index c1d1e1f..0000000 Binary files a/legacy/share/emoji/🌨.png and /dev/null differ diff --git a/legacy/share/emoji/🌩.png b/legacy/share/emoji/🌩.png deleted file mode 100644 index bb84231..0000000 Binary files a/legacy/share/emoji/🌩.png and /dev/null differ diff --git a/legacy/share/emoji/🌫.png b/legacy/share/emoji/🌫.png deleted file mode 100644 index 5a15aa4..0000000 Binary files a/legacy/share/emoji/🌫.png and /dev/null differ diff --git a/legacy/share/help.txt b/legacy/share/help.txt deleted file mode 100644 index 89643b0..0000000 --- a/legacy/share/help.txt +++ /dev/null @@ -1,69 +0,0 @@ -Usage: - - $ curl wttr.in # current location - $ curl wttr.in/muc # weather in the Munich airport - -Supported location types: - - /paris # city name - /~Eiffel+tower # any location (+ for spaces) - /Москва # Unicode name of any location in any language - /muc # airport code (3 letters) - /@stackoverflow.com # domain name - /94107 # area codes - /-78.46,106.79 # GPS coordinates - -Special locations: - - /moon # Moon phase (add ,+US or ,+France for these cities) - /moon@2016-10-25 # Moon phase for the date (@2016-10-25) - -Units: - - m # metric (SI) (used by default everywhere except US) - u # USCS (used by default in US) - M # show wind speed in m/s - -View options: - - 0 # only current weather - 1 # current weather + today's forecast - 2 # current weather + today's + tomorrow's forecast - A # ignore User-Agent and force ANSI output format (terminal) - F # do not show the "Follow" line - n # narrow version (only day and night) - q # quiet version (no "Weather report" text) - Q # superquiet version (no "Weather report", no city name) - T # switch terminal sequences off (no colors) - -PNG options: - - /paris.png # generate a PNG file - p # add frame around the output - t # transparency 150 - transparency=... # transparency from 0 to 255 (255 = not transparent) - -Options can be combined: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # in PNG the file mode are specified after _ - /Rome_0pq_lang=it.png # long options are separated with underscore - -Localization: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Supported languages: - - FULL_TRANSLATION (supported) - PARTIAL_TRANSLATION (in progress) - -Special URLs: - - /:help # show this page - /:bash.function # show recommended bash function wttr() - /:translation # show the information about the translators - diff --git a/legacy/share/iterm2.txt b/legacy/share/iterm2.txt deleted file mode 100644 index a4ae1a4..0000000 --- a/legacy/share/iterm2.txt +++ /dev/null @@ -1 +0,0 @@ -]1337;File=name=TnVyZW1iZXJnLnBuZw==;size=46226;inline=1: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 diff --git a/legacy/share/list-of-iata-codes.txt b/legacy/share/list-of-iata-codes.txt deleted file mode 100644 index e5422bb..0000000 --- a/legacy/share/list-of-iata-codes.txt +++ /dev/null @@ -1,5656 +0,0 @@ -GKA -MAG -HGU -LAE -POM -WWK -UAK -GOH -SFJ -THU -AEY -EGS -HFN -HZK -IFJ -KEF -PFJ -RKV -SIJ -VEY -YAM -YAV -YAW -YAY -YAZ -YBB -YBC -YBG -YBK -YBL -YBR -YCB -YCD -YCG -YCH -YCL -YCO -YCT -YCW -YCY -YZS -YDA -YDB -YDC -YDF -YDL -YDN -YDQ -YEG -YEK -YEN -YET -YEU -YEV -YFB -YFC -YFO -YFR -YFS -YGK -YGL -YGP -YGQ -YGR -YHB -YHD -YHI -YHK -YHM -YHU -YHY -YHZ -YIB -YIO -YJN -YJT -YKA -YKF -YKL -YKY -YKZ -YLD -YLJ -YLL -YLT -YLW -YMA -YMJ -YMM -YMO -YMW -YMX -YNA -YND -YNM -YOC -YOD -YOJ -YOW -YPA -YPE -YPG -YPL -YPN -YPQ -YPR -YPY -YQA -YQB -YQF -YQG -YQH -YQK -YQL -YQM -YQQ -YQR -YQT -YQU -YQV -YQW -YQX -YQY -YQZ -YRB -YRI -YRJ -YRM -YRT -YSB -YSC -YSJ -YSM -YSR -YSU -YSY -YTE -YTH -YTR -YTS -YTZ -YUB -YUL -YUT -YUX -YUY -YVC -YVG -YVM -YVO -YVP -YVQ -YVR -YVT -YVV -YWA -YWG -YWK -YWL -YWY -YXC -YXD -YXE -YXH -YXJ -YXL -YXP -YXR -YXS -YXT -YXU -YXX -YXY -YYB -YYC -YYD -YYE -YYF -YYG -YYH -YYJ -YYL -YYN -YYQ -YYR -YYT -YYU -YYW -YYY -YYZ -YZD -YZE -YZF -YZH -YZP -YZR -YZT -YZU -YZV -YZW -YZX -ZFA -ZFM -BJA -ALG -DJG -QFD -VVZ -TMR -GJL -AAE -CZL -TEE -HRM -TID -TIN -QAS -TAF -TLM -ORN -MUW -AZR -BSK -ELG -GHA -HME -INZ -TGR -LOO -TMX -OGX -IAM -COO -OUA -BOY -ACC -TML -NYI -TKD -ABJ -BYK -DJO -HGO -MJC -SPY -ASK -ABV -AKR -BNI -CBQ -ENU -QUS -IBA -ILR -JOS -KAD -KAN -MIU -MDI -LOS -MXJ -PHC -SKO -YOL -ZAR -MFQ -NIM -THZ -AJY -ZND -MIR -TUN -GAF -GAE -DJE -EBM -SFA -TOE -LRL -LFW -ANR -BRU -CRL -QKT -LGG -OST -AOC -BBH -SXF -DRS -ERF -FRA -FMO -HAM -THF -CGN -DUS -MUC -NUE -LEJ -SCN -STR -TXL -HAJ -BRE -QEF -HHN -MHG -XFW -KEL -LBC -ZCA -ESS -MGL -PAD -DTM -AGB -OBF -RBM -FDH -SZW -ZSN -BYU -HOQ -ZNV -ZQF -ZQC -ZQW -ZQL -BWE -KSF -BRV -EME -WVN -BMK -NRD -FLF -GWT -KDL -URE -EPU -TLL -TAY -ENF -KEV -HEM -HEL -HYV -IVL -JOE -JYV -KAU -KEM -KAJ -KOK -KAO -KTT -KUO -LPP -MHQ -MIK -OUL -POR -RVN -SVL -SOT -TMP -TKU -QVY -VAA -VRK -BFS -ENK -BHD -LDY -BHX -CVT -GLO -MAN -NQY -LYE -YEO -CWL -SWS -BRS -LPL -LTN -PLH -BOH -SOU -QLA -ACI -GCI -JER -ESH -BQH -LGW -LCY -FAB -BBS -LHR -SEN -LYX -MSE -CAX -BLK -HUY -BWF -LBA -CEG -IOM -NCL -MME -EMA -KOI -LSI -WIC -ABZ -INV -GLA -EDI -ILY -PIK -BEB -SCS -DND -SYY -TRE -ADX -LMO -CBG -NWI -STN -EXT -FZO -OXF -MHZ -FFD -BZZ -ODH -NHT -QCY -BEQ -HRT -WTN -KNF -MPN -AMS -MST -EIN -GRQ -DHR -LEY -LWR -RTM -UTC -ENS -LID -WOE -ORK -GWY -DUB -NOC -KIR -SNN -SXL -WAT -AAR -BLL -CPH -EBJ -KRP -ODE -RKE -RNN -SGD -SKS -TED -FAE -STA -AAL -LUX -AES -ANX -ALF -BNN -BOO -BGO -BJF -KRS -BDU -Norway -VDB -FRO -OSL -HAU -HAA -KSU -KKN -FAN -MOL -MJF -LKL -NTB -OLA -RRS -RYG -Norway -SKE -SRP -SSJ -TOS -Norway -TRD -SVG -GDN -KRK -KTW -POZ -RZE -SZZ -OSP -WAW -WRO -IEG -RNB -GOT -JKG -LDK -GSE -KVB -THN -KSK -MXX -NYO -KID -JLD -OSK -KLR -MMX -HAD -VXO -EVG -GEV -HUV -KRF -LYC -SDL -OER -KRN -SFT -UME -VHM -AJR -ORB -VST -LLA -ARN -BMA -BLE -HLF -GVX -LPI -NRK -VBY -SPM -RMS -GHF -ZCN -ZNF -GKE -RLG -FEL -IGS -GUT -ALJ -AGZ -BIY -BFN -CPT -DUR -ELS -GCJ -GRJ -HDS -JNB -KIM -KMH -KLZ -HLA -LAY -MGH -MEZ -NCS -DUH -PLZ -PHW -PZB -NTY -PTG -UTW -RCB -ROD -SBU -SIS -SZK -LTA -ULD -UTN -UTT -VRU -VIR -PRY -WEL -FRW -JWA -BBK -MUB -GBE -PKW -BZV -FTX -OUE -PNR -MTS -BGF -BBT -BSG -SSG -ASI -MRU -RRG -TKC -DLA -MVR -FOM -NGE -GOU -BFX -BPC -YAO -LVI -LUN -MFU -NLA -KIW -HAH -NWA -AJN -DZA -RUN -ZSE -TNR -ZVA -SMS -TMM -MOQ -DIE -WMR -ZWA -AMB -ANM -HVA -MJN -NOS -BPY -WMN -SVB -VOH -WAI -IVA -FTU -WFI -RVA -WVK -MNJ -MXM -TLE -SSY -BUG -CAB -NOV -SVP -LAD -MEG -SPP -GXG -PBN -VHC -SZA -SDD -LUO -UGO -XGN -OYE -OKN -LBQ -BMM -POG -OMB -MKU -LBV -MVB -PCP -TMS -BEW -INH -VXC -MPM -MZB -MNC -APL -POL -UEL -TET -VNX -DES -SEZ -PRI -AEH -MQQ -NDJ -FYT -BUQ -BFO -VFA -HRE -KAB -MVZ -GWE -WKM -BLZ -KGJ -LLW -ZZU -MSU -FIH -NLO -MNB -FDU -KKW -MDK -BDT -GMA -LIQ -FKI -IRP -BUX -BKY -GOM -KND -FBM -KWZ -FMI -KMN -KGA -MJM -BKO -GAQ -KYS -MZI -TOM -BJL -FUE -VDE -SPC -LPA -ACE -TFS -TFN -MLN -FNA -MLW -ROB -AGA -TTA -FEZ -ERH -MEK -OUD -RBA -CMN -RAK -NNA -OZZ -AHU -TTU -TNG -ZIG -CSK -KLC -DKR -XLS -BXE -KGG -TUD -IEO -TIY -KFA -EMN -KED -NKC -SEY -ATR -NDB -FIG -FAA -LEK -SID -BVC -MMO -SNE -VXE -ADD -AMH -AXU -BJR -DIR -GMB -GDQ -JIM -LLI -MQX -ASO -BJM -HGA -BBO -KMU -ALY -ABS -CAI -HRG -EGR -LXR -MUH -PSD -SKV -ASW -ELT -EDL -KIS -KTL -LOK -LAU -MBA -WIL -WJR -GHT -AKF -BEN -SEB -TIP -LTD -GYI -KGL -KME -DOG -ELF -KSL -EBD -JUB -MAK -KRT -ARK -DAR -DOD -IRI -JRO -LKY -MYW -MWZ -PMA -TGT -ZNZ -EBB -SRT -TIA -BOJ -GOZ -PDV -SOF -VAR -LCA -PFO -AKT -DBV -OSI -PUY -RJK -SPU -ZAG -ZAD -ALC -LEI -OVD -ODB -BIO -BCN -BJZ -LCG -GRO -GRX -IBZ -XRY -MJV -MAD -AGP -MAH -OZP -PNA -REU -SLM -EAS -SCQ -LEU -TOJ -VLC -VLL -VIT -VGO -SDR -ZAZ -SVQ -CQF -LTQ -AGF -BOD -EGC -CNG -PIS -MCU -LIG -NIT -TLS -PUF -LDE -ANG -BVE -PGX -BIQ -XAC -LBI -DCM -RDZ -RYN -RCO -CMR -DLE -OBS -LPY -XBK -XVF -XMU -ETZ -BIA -CLY -FSC -AJA -SOZ -AUF -CMF -CFE -BOU -XCD -QNJ -LYS -QNX -RNE -NCY -GNB -VAF -VHY -AUR -CHR -LYN -QXB -CEQ -EBU -CCF -MRS -NCE -PGF -CTT -MPL -BZR -AVN -MEN -BVA -LEH -ORE -XCR -URO -TUF -CET -LVA -LBG -CSF -CDG -TNF -ORY -POX -QYR -NVS -LIL -BES -CER -DNR -GFR -DOL -LRT -EDM -CFR -LME -RNS -LAI -UIP -NTE -SBK -MXN -VNE -SNR -BSL -DIJ -MZM -EPL -ENC -RHE -SXB -TLN -FNI -MQC -FSP -PYR -AGQ -AXD -VOL -JKH -IOA -HER -KSO -KIT -EFL -KLX -KGS -AOK -CFU -KSJ -KVA -KZI -LRS -LXS -LRA -JMK -MJT -PVK -RHO -GPA -CHQ -JSI -SMI -JTR -JSH -SKU -SKG -ZTH -BUD -DEB -CRV -BRI -FOG -TAR -LCC -PSR -BDS -SUF -CTA -LMP -PNL -PMO -REG -TPS -NSY -AHO -DCI -CAG -OLB -TTB -MXP -BGY -TRN -ALL -GOA -LIN -PMF -QPZ -CUF -AVB -BZO -BLQ -TSF -FRL -VBS -TRS -RMI -VIC -QPA -VRN -VCE -SAY -CIA -FCO -EBA -QLT -NAP -PSA -FLR -GRS -PEG -LJU -MBX -POW -KLV -OSR -PED -PRV -PRG -BRQ -TLV -BEV -ETH -HFA -RPN -VDA -SDV -MLA -GRZ -INN -LNZ -SZG -VIE -SMA -BGC -FLW -FAO -GRW -HOR -TER -PDL -PIX -OPO -PXO -LIS -SJZ -VRL -OMO -SJJ -ARW -BCM -BAY -BBU -CND -CLJ -CSB -CRA -IAS -OMR -OTP -SBZ -SUJ -SCV -TCE -TGM -TSR -GVA -SIR -EML -LUG -BRN -ZRH -ACH -SMV -ESB -ANK -ADA -UAB -AFY -AYT -GZT -KYA -MLX -MZH -VAS -ASR -DNZ -IST -BZI -BDM -ESK -ADB -IGL -DLM -BXN -EZS -DIY -ERC -ERZ -TZX -VAN -BAL -BZY -KIV -OHD -SKP -GIB -BEG -INI -TGD -PRN -TIV -BTS -KSC -PZY -SLD -TAT -NCA -PLS -XSC -EPS -BRX -LRM -PUJ -POP -SDQ -STI -CBV -GUA -LCE -SAP -GJA -RTB -TEA -TGU -OCJ -KIN -MBJ -POT -KTP -ACA -NTR -AGU -HUX -CVJ -CME -CUL -CTM -CEN -CPE -CJS -CUU -CVM -CZM -DGO -TPQ -ESE -GDL -GYM -TCN -HMO -CLQ -ISJ -SLW -LZC -LMM -BJX -LAP -LTO -MAM -MID -MXL -MLM -MTT -LOV -MEX -MTY -MZT -NOG -NLD -OAX -PAZ -PBC -PCA -PPE -PDS -UPN -PVR -PXM -QRO -REX -SJD -SFH -SLP -TXA -TRC -TGZ -TIJ -TAM -TSL -TLC -TAP -CUN -VSA -VER -ZCL -ZIH -ZMM -ZLO -BEF -MGA -PUZ -BOC -CHX -DAV -BLB -PAC -PTY -OTR -GLF -LIR -LIO -NOB -SJO -PMZ -XQP -SAL -CAP -PAP -BCA -BYM -AVI -CCC -CFG -CYO -CMW -SCU -GAO -HAV -HOG -LCL -MOA -MZO -GER -UPB -SNU -VRA -VTU -CYB -GCM -ASD -MHH -SAQ -AXP -TCB -CCZ -BIM -GGT -ELH -GHB -RSD -FPO -IGA -LGI -SML -MYG -NAS -ZSA -BZE -AIT -RAR -NAN -SUV -TBU -VAV -TRW -TBF -WLS -APW -PPG -RUR -TUB -AAA -TIH -REA -FAV -XMH -GMR -KKR -MKP -PKP -TKP -AXR -MVT -TKX -NHV -BOB -RGI -HUH -MOZ -HOI -MAU -RFP -VLI -KNQ -KOC -LIF -GEA -MEE -TOU -UVE -NOU -AKL -TUO -AMZ -CHC -CHT -DUD -GIS -HKK -HLZ -KKE -KAT -ALR -MON -TEU -MRO -NPL -NSN -IVC -OAM -PMR -PPQ -ZQN -ROT -TRG -TIU -BHE -WKA -WHK -WLG -WRE -WSZ -WAG -HEA -JAA -KBL -KDH -MMZ -MZR -UND -BAH -AHB -HOF -ABT -BHH -DMM -DHA -GIZ -ELQ -URY -HAS -JED -HBT -MED -EAM -AQI -RAH -RUH -RAE -SHW -SLF -TUU -TIF -TUI -EJH -YNB -ABD -QMJ -MRX -AWZ -BUZ -KIH -BDH -KSH -SDG -IFN -RAS -THR -BND -KER -XBJ -RZR -SYZ -TBZ -AZD -ACZ -ZBR -ZAH -AMM -ADJ -AQJ -OMF -KWI -BEY -AUH -AZI -DXB -FJR -RKT -SHJ -KHS -MSH -MCT -SLL -TTH -LYP -GWD -GIL -KHI -LHE -MFG -MJD -MUX -WNS -PJG -PSI -PEW -UET -RYK -ISB -RAZ -SKZ -SDT -SUL -BDN -PZH -BSR -ALP -DAM -DEZ -LTK -PMS -CIS -ROP -SPN -UAM -GUM -TIQ -MAJ -KWA -CXI -MDY -TKK -PNI -ROR -KSA -YAP -KNH -TTT -GNI -KHH -CYI -KYD -RMQ -TNN -MZG -PIF -TSA -TPE -WOT -HUN -NRT -MMJ -IBR -IWO -SHM -OBO -CTS -HKD -SPK -MMB -SHB -WKJ -IKI -UBJ -TSJ -MBE -AKJ -OIR -RIS -KUM -FUJ -FUK -TNE -KOJ -KMI -OIT -KKJ -KMJ -NGS -ASJ -TKN -KMQ -OKI -TOY -HIJ -OKJ -IZO -YGJ -KCZ -MYJ -ITM -TTJ -TKS -TAK -AOJ -GAJ -SDS -HNA -AXT -MSJ -SDJ -HAC -OIM -HND -OKO -KWJ -CHN -RSU -SHO -KAG -CJU -PUS -USN -SSN -OSN -GMP -SWU -KPO -TAE -YEC -OKA -DNA -ISG -UEO -MMD -MMY -KTD -SHI -RNJ -OGN -MNL -CBO -CGY -PAG -GES -ZAM -BAG -SJI -TAC -BCD -DGT -MPH -ILO -KLO -PPS -COC -GHU -PRA -ROS -SFN -AEP -COR -LPG -MDZ -LGS -AFA -CTC -SDE -IRJ -TUC -UAQ -RCU -VDR -LUQ -CNQ -RES -FMA -IGR -AOL -PSS -SLA -JUJ -ORA -EHL -CRD -EQS -REL -VDM -PMY -PUD -RGA -RGL -USH -ULA -PMQ -RZA -BHI -MDQ -NQN -RSA -BRC -TDL -VLG -CPC -CDJ -AQA -AJU -AFL -ARU -BEL -BGX -PLU -BFH -BSB -BAU -BVB -CAC -CNF -CGR -XAP -CLN -CCM -CAW -CMG -CWB -CRQ -CXJ -CGB -CZS -PPB -MAO -IGU -FLN -FEN -FOR -GIG -GYN -GRU -ATM -ITB -IOS -IPN -IMP -JDF -JPA -JOI -CPV -VCP -LIP -LDB -LAZ -MAB -MGF -MOC -PLL -MCZ -MCP -MVF -MNX -NVT -GEL -NAT -POA -POO -PFB -PET -PNZ -PNB -PMG -PVH -RBR -REC -SDU -RAO -STU -SJK -SLZ -CGH -SJP -SSZ -SSA -TMT -THE -TFF -TBT -TUR -SJL -PAV -URG -UDI -UBA -VAG -BVH -VIX -QPS -ARI -BBA -CCH -CJC -PUQ -GXQ -IQQ -SCL -ANF -WPR -LSQ -WPU -CCP -IPC -ZOS -LSC -ZCO -PMC -WCH -ZAL -ATF -OCC -CUE -GPS -GYE -LTX -XMS -MCH -MEC -PVO -UIO -ETR -SNC -TPC -TUA -ASU -CIO -AXM -PUU -BGA -BOG -BAQ -BSC -BUN -CUC -CTG -CLO -TCO -CZU -EJA -FLA -GPI -IBE -IPI -APO -LET -EOH -MGN -MTR -MVP -MZL -NVA -OCV -OTU -PCR -PEI -PPN -PSO -PVA -MDE -RCH -SJE -SMR -ADZ -SVI -TME -AUC -UIB -ULQ -VUP -VVC -BJO -CBB -CIJ -LPB -POI -PSZ -SRE -TJA -TDD -VVI -BYC -PBM -CAY -PCL -CHM -CIX -AYP -ANS -ATA -LIM -JJI -JUL -TBP -YMS -CHH -IQT -AQP -TRU -PIO -TPP -TCQ -PEM -PIU -TYL -CUZ -MVD -STY -AGV -AAO -BLA -BNS -BRM -CBL -CAJ -CUP -CZE -CUM -GUI -GUQ -LSP -LFR -MAR -MRD -PMV -CCS -MUN -PYH -PBL -PZO -SVZ -SNV -STD -SFD -SOM -STB -TUV -VLN -VLV -VDP -LTM -ANU -BGI -DCF -DOM -FDF -SFG -PTP -GND -STT -STX -BQN -FAJ -SIG -MAZ -PSE -SJU -SKB -SLU -UVF -AUA -BON -CUR -EUX -SXM -AXA -TAB -POS -EIS -CIW -MQS -SVD -ALA -BXH -TSE -DMB -FRU -OSS -CIT -URA -PWQ -PLX -AKX -GYD -YKS -MJZ -BQS -KHV -PVS -GDX -PWE -PKC -UUS -VVO -HTA -BTK -IKT -UUD -KBP -DOK -DNK -SIP -IEV -LWO -ODS -LED -MMK -GME -VTB -KGD -MHP -MSQ -ABA -BAX -KEJ -OMS -KRR -MCX -MRV -STW -ROV -AER -ASF -VOG -CEK -MQF -NJC -PEE -SGC -SVX -ASB -KRW -CRZ -DYU -BHK -SKD -TAS -BZK -SVO -KLD -VOZ -VKO -SCW -KZN -REN -UFA -KUF -AMD -AKD -IXU -BOM -PAB -BHJ -IXG -BDQ -BHO -BHU -NMB -GOI -IDR -JLR -JGA -IXY -HJR -KLH -IXK -NAG -ISK -PNQ -PBD -RAJ -RPR -SSE -STV -UDR -CMB -ACJ -RML -GOY -JAF -TRR -PNH -REP -TNX -IXA -AJL -IXB -BBI -CCU -COH -DBD -GAY -IMF -IXW -JRH -IXH -IXS -IXI -DIB -PAT -IXR -RRK -VTZ -CXB -CGP -IRD -JSR -RJH -SPD -ZYL -DAC -HKG -AGR -IXD -ATQ -VNS -KUU -IXC -DED -DEL -GWL -JDH -JAI -JSA -IXJ -KNU -KTU -LUH -IXL -LKO -PGH -SXR -TNI -LPQ -PKZ -ZVK -VTE -MFM -BWA -KTM -PKR -SIF -BIR -AGX -BLR -BEP -VGA -CJB -COK -CCJ -CDP -BPM -IXM -IXE -MAA -IXZ -PNY -RJA -TIR -TRZ -TRV -PBH -MLE -DMK -UTP -LPT -PRH -HHQ -PHS -NAW -KBV -PAN -USM -HKT -UNN -HDY -TST -UTH -SNO -LOE -DAD -HAN -NHA -HUI -PQC -SGN -NYU -HEH -KET -KYP -LSH -MDL -MGZ -MYT -MOG -PBU -AKY -SNW -THL -RGN -UPG -BIK -NBX -TIM -DJJ -WMX -MKQ -GTO -PLW -MDC -PSJ -OTI -TTE -LUW -Indonesia -FKQ -KNG -BXB -MKW -SOQ -BTU -KCH -LMN -MUR -MYY -SBW -LDU -BKI -LBU -TWU -BWN -PKU -DUM -CGK -GNS -MES -KTG -PNK -DJB -BKS -PLM -RGT -BTJ -AOR -KBR -KUA -KTE -IPH -JHB -KUL -LGK -MKZ -TGG -PEN -DIL -QPG -XSP -SIN -ABM -ASP -BNE -OOL -CNS -CTL -ISA -MCY -MKY -PPP -ROK -TSV -WEI -AVV -ABX -MEB -HBA -LST -MBW -MEL -Australia -ADL -JAD -KTA -KGI -KNX -LEA -PHE -PER -UMR -XCH -BWU -CBR -CFS -CDU -DBO -NLK -SYD -TMW -WGA -PEK -HLD -TSN -TYN -CAN -CSX -KWL -NNG -SZX -CGO -WUH -FNJ -LHW -XIY -ULN -JHG -KMG -XMN -KHN -FOC -HGH -NGB -NKG -HFE -TAO -SHA -YNT -CKG -KWE -CTU -XIC -KHG -HTN -URC -HRB -MDG -DLC -PVG -TOD -SZB -NTQ -HBE -BTI -LUR -PIZ -ITO -ORL -BTT -Z84 -UTO -FYU -SVW -FRN -TLJ -CZF -BED -SNP -EHM -STG -ILI -PTU -BMX -OSC -OAR -MHR -BYS -NXP -FSM -MRI -GNT -PNC -SVN -GFK -PBF -NSE -HNM -PRC -TTN -BOS -SUU -RME -ENV -BFM -OAK -OMA -NOW -OGG -ICT -MCI -MSN -DLG -HRO -PHX -BGR -FXE -GGG -AND -GEG -HWO -SFO -CTB -ARA -GNV -MEM -DUG -BIG -CNW -ANN -CAR -LRF -HUA -POB -DHT -DLF -LAX -ANB -CLE -DOV -CVG -FME -NID -HON -JNU -LFT -EWR -BOI -INS -GCK -MOT -HHI -MXF -DAL -FCS -HLN -NKX -LUF -HHR -HUL -END -NTD -EDW -LCH -KOA -MYR -NLC -ACK -FAF -HOP -DCA -NHK -PSX -BYH -ACY -TIK -PUB -PQI -GRF -ADQ -UPP -FLL -MKO -INL -SLC -CDS -BIX -LSF -FRI -MDT -LNK -LAN -MUE -MSS -HKY -SPG -FMY -IAH -MLT -ADW -INT -VCV -CEW -GTB -PHN -BFL -ELP -HRL -CAE -DMA -NPA -PNS -RDR -HOU -BKF -ORT -PAQ -PIT -BRW -EFD -NUW -ALI -VAD -MIA -SEA -CHA -BDR -JAN -GLS -LGB -HDH -IPT -IND -SZL -AKC -GWO -HPN -FOK -JBR -LNA -NZY -BIF -YUM -CNM -DLH -BET -LOU -FHU -LIH -HUF -HVR -MWH -MPV -RIC -SHV -CDV -ORF -BPT -SAV -HIF -OME -PIE -MNM -CXO -SCC -SAT -ROC -COF -TEB -RCA -RDU -DAY -ENA -MLC -IAG -CFD -PHF -ESF -LTS -TUS -MIB -BAB -IKK -GSB -PVD -SBY -RIU -BUR -DTW -TPA -PMB -POE -EIL -HIB -LFK -MAF -GRB -ADM -WRI -SBO -AGS -ISN -LIT -SWF -BDE -SAC -HOM -TBN -MGE -SKA -HTL -PAM -DFW -MLB -TCM -AUS -LCK -MQT -TYS -HLR -STL -MIV -SPS -LUK -ATL -MER -MCC -GRR -INK -FAT -VRB -IPL -BNA -LRD -EDF -OTZ -AOO -DYS -ELD -LGA -TLH -DPA -ACT -AUG -INJ -MKL -MKK -FTK -SJT -CXL -CIC -BTV -JAX -DRO -IAD -CLL -SFF -MKE -ABI -COU -PDX -TNT -PBI -FTW -OGS -BFI -SKF -HNL -DSM -EWN -SAN -MLU -SSC -ONT -GVT -ROW -DET -BRO -DHN -WWD -MTC -FMN -CRP -SYR -NQX -MDW -SJC -HOB -PNE -DEN -PHL -SUX -MCN -TCS -PMD -RND -NJK -CMH -FYV -FSI -PNM -FFO -GAL -MWL -IAB -NBG -BFT -TXK -PBG -APG -TCC -ANC -GRK -ZUN -BLI -NQA -EKN -HFD -SFZ -MOB -NUQ -SAF -BKH -DRI -BSF -OLS -MCF -BLV -OPF -DRT -RSW -AKN -MUI -JHM -JFK -HST -RAL -FLV -WAL -HMN -NXX -CYS -SCK -CHS -RNO -KTN -YIP -VBG -BHM -NEL -LSV -RIV -MOD -SMF -UGN -COS -BUF -SKY -PAE -MUO -CDC -BDL -MFE -NGU -CEF -LBB -ORD -BCT -FAI -NYG -CVS -NGF -OFF -GKN -ART -PSP -AMA -FOD -BAD -FOE -COT -ILM -United States -TYR -BWI -HBR -LNY -AEX -WSD -CDB -TUL -SIT -ISP -MSP -ILG -DUT -MSY -PWM -OKC -ALB -VDZ -LFI -SNA -CBM -TMB -NTU -GUS -CPR -VPS -SEM -EYW -CLT -LAS -MCO -FLO -GTF -YNG -FBK -MMV -WRB -BKK -NAH -TTR -KDI -SBG -MLG -BDO -CBN -JOG -CXP -PCB -SRG -BTH -TJQ -PGK -TNJ -SIQ -BDJ -PKN -PKY -MOF -ENE -RTG -KOE -LBJ -BPN -TRK -SRI -AMI -BMU -WGP -SUB -SOC -ICN -CNX -CEI -NST -NAK -KOP -UBP -KKC -THS -DPS -ATH -NGO -UKB -PUW -LWS -ELM -ITH -MRY -SBA -DAB -LPX -RIX -SQQ -HLJ -KUN -PLQ -VNO -PNV -EVN -LWN -ASA -ASM -MSW -GZA -BUS -KUT -TBS -RIY -TAI -HOD -ADE -AXK -AAY -SAH -BHN -SCT -FMM -NAV -EZE -EBL -EMD -HEW -KIX -TAG -JAV -JCH -JEG -PMI -DRW -URT -TKA -GZM -HVN -AVL -GSO -FSD -AYQ -MHT -APF -RDN -SDF -CHO -ROA -LEX -EVV -ABQ -BZN -BIL -BTM -TVC -FRS -BHB -RKD -JAC -RFD -DME -SYX -MFN -LJG -GSP -BMI -GPT -AZO -TOL -FWA -DEC -CID -LSE -CWA -PIA -ATW -RST -CMI -MHK -KGC -HVB -DLU -MZV -SSH -FKL -NBO -SEU -FTE -ARM -GJT -SGU -DWH -S46 -SRQ -BDA -VNY -MLI -PFN -HIR -PPT -INU -FUN -OVB -XKH -BIS -TEX -INC -HGN -RAP -CLD -FNT -DVO -FNC -STM -KOS -YOA -NPE -LEV -LXA -RDD -EUG -IDA -MFR -KBZ -RDM -PCN -WDH -YWH -TNA -CZX -YBP -TJM -CAK -HSV -PKB -MGM -TRI -PAH -JIB -HAK -MFA -PGA -UII -FCA -MBS -BGM -BGW -NNT -ROI -BFV -TDX -BLH -CRK -SDK -LXG -ODY -SHE -MNI -PSG -LYA -XUZ -MWQ -KHM -DLI -VKG -CAH -VCL -TBB -PYY -BWK -NSI -CKY -AAH -FKB -SFB -JST -LUA -BHP -LDN -JMO -NGX -PPL -RUM -DNP -RUK -JUM -TPJ -TMI -SKH -IMK -DOP -BJH -DHI -MWX -JTY -JIK -JKL -MLO -JNX -PAS -KZS -RMF -NRN -USU -BXU -DPL -LAO -LGP -OZC -CEB -NOE -JUI -BPS -PMW -CLV -MSO -BKQ -BDB -GCN -SGR -HIS -APA -CVN -FST -LVS -IWS -LHX -LRU -BKD -TPL -OZA -KDM -LAK -YWJ -ZFN -YGH -TAH -YPC -SRZ -SAB -EGE -SKN -CGF -MFD -CSG -LAW -FNL -FLG -TVL -TWF -MVY -CON -GON -STC -BPE -GTR -GOJ -HQM -ERI -HYA -SDX -MGW -CRW -AVP -BJI -THG -FGI -BNK -FAR -MKC -RBE -GCC -TOF -PHY -CJM -JZH -SWA -GEO -AGT -OGL -KAI -DNH -AOI -CPO -TCP -LYB -BJV -TBJ -SAW -SCE -BME -NTL -KLU -HFT -HVG -MEH -VDS -IKA -MHD -UIK -MEI -SPI -CEZ -HDN -GUP -LBL -LAA -GLD -COD -Norway -ISC -SGF -NVK -BVG -Norway -NSK -AAQ -JLN -ABE -XNA -GUW -KZO -SBN -BKA -ARH -RTW -NUX -NOJ -SCO -UCT -USK -PEX -NNM -PKV -KGP -KJA -KGF -URJ -IWA -CGQ -KIJ -JON -SMD -ACV -OAJ -TCL -DBQ -ATD -AKS -BAS -FRE -MBU -IRA -SCZ -MUA -GZO -MNY -RNL -RUS -VAO -KGE -RBV -BUA -CMU -DAU -GUR -PNP -HKN -UNG -KRI -KMA -KVG -MDU -MAS -MXH -MIS -TIZ -TBG -RAB -VAI -WBM -LLU -CNP -JFR -JGO -JJU -JSU -JNN -JNS -NAQ -JHS -JUV -JQA -GRY -THO -VPN -YWS -YAA -YWM -YFX -YHA -YRG -YCK -YLE -SUR -YAX -WNN -YNO -XBE -KIF -YOG -YHP -YKU -ZTB -ZLT -YAC -YAG -XKS -YKG -YAT -YBE -YBX -YRF -YCS -YDP -YER -YFA -YFH -YMN -YGB -YGO -YGT -YGW -YGX -YGZ -YQC -CXH -YNS -YHO -YHR -YIK -YIV -AKV -YKQ -YPJ -YLC -YLH -YSG -XGR -YMH -YMT -YUD -YNC -YNE -YNL -YOH -YPH -YPM -YPO -YPW -YQD -YQN -YRA -YRL -YSF -YSK -YST -YTL -YVZ -YWP -YXN -YZG -ZAC -ILF -ZBF -ZEM -ZFD -ZGI -ZJN -ZKE -MSA -ZMT -ZPB -ZRJ -ZSJ -ZTM -ZUM -ZWL -BLJ -CBH -BMW -ELU -KMS -HDF -HEI -HGL -SJY -NQT -United Kingdom -CAL -EOI -FIE -NRL -PPW -SOY -NDY -LWK -WRY -LEQ -PZE -VLY -BRR -CFN -CNL -LKN -OSY -Norway -Norway -RET -SDN -SOG -SVJ -SOJ -Norway -VRY -BZG -LCJ -OSD -HFS -KSD -TYF -AGH -SQO -HMV -VTS -QRA -MQP -AAM -MBD -GNZ -ORP -SWX -TLD -DIS -CIP -SLI -YVA -WAQ -JVA -BMD -MXT -TVA -WTA -WTS -WAM -WPB -DWB -WMP -TTS -WMA -MJA -CBT -DUE -VPE -MSZ -KOU -MJL -TCH -VPY -SRH -CMK -LUD -OND -OMD -SWP -ERS -BOA -MAT -INO -NIO -KRZ -BSU -TSH -LJA -PFR -GMZ -BTE -KBS -KEN -OXB -SMW -VIL -ESU -EUN -NDR -Cape Verde -Cape Verde -BCO -BEI -DSE -DEM -GDE -GOR -ABK -MTF -TIE -ALU -BSA -MGQ -GLK -BUO -AAC -ATZ -ASV -LKG -MYD -NYK -SRX -TOB -MJI -LAQ -ATB -UYL -PZU -BKZ -TKQ -LDI -MUZ -SHY -TBO -RUA -ULU -DIU -ABR -ABY -AHN -ALM -ALO -ALW -APN -ATY -BFD -BFF -BKW -BQK -BRL -CEC -CGI -CIU -CKB -CLM -CMX -DDC -DUJ -EAU -EKO -EWB -FAY -GGW -GRI -HOT -HTS -KIO -IRK -JMS -LAR -LBE -LBF -LEB -LMT -LNS -LWT -LYH -MKG -MLS -MSL -OTH -OWB -PIB -PIH -PIR -PLN -PSM -RDG -RHI -RKS -RUT -SBP -SHR -SLK -SLN -SMX -TUP -UIN -VCT -VLD -WRL -YKM -ECN -RJL -IDY -ANE -LTT -JSY -PEV -QGY -SOB -AOT -QSR -CVU -BNX -USQ -KSY -SFQ -KCM -AJI -ADF -ISE -EDO -SZF -ILZ -GDT -MDS -SLX -AZS -JBQ -PBR -AAZ -UTK -AHS -PEU -MIJ -CYW -CUA -GUB -JAL -CTD -ONX -JQE -PLP -TTQ -BCL -TNO -PBP -PJM -SYQ -JEE -PAX -TND -COX -ATC -CAT -CRI -PID -AIU -MGS -MHX -MUK -MOI -PYE -ICI -PTF -KDV -MNF -MFJ -NGI -LKB -LBS -TVU -KXF -RTA -SVU -EUA -HPA -Tonga -NTT -VBV -IUE -FUT -MXS -APK -AHE -AUQ -UAP -UAH -MTV -SLH -TOH -EAE -CCV -LOD -SSR -PBJ -LPM -LNB -MWF -LNE -NUS -ZGU -RCL -SON -TGH -ULB -VLS -SWJ -OLZ -AUY -AWD -DLY -FTA -IPA -TGJ -BMY -ILP -FBD -DWD -AJF -EWD -KHD -BXR -RJN -BJB -AFZ -NSH -SRY -LRR -ADU -OMH -AAN -BNP -BHV -CJL -DBA -DEA -DSK -JIW -HDD -KDD -ORW -PAJ -KDU -SYW -TUK -ISU -KAC -GXF -ADK -GST -SGY -HCR -HNS -KLG -MCG -MOU -ANI -VAK -WRG -LUP -ENT -LZN -HCN -MFK -KUH -OKD -HSG -NKM -IWJ -FKS -ONJ -SYO -MYE -KUV -MPK -WJU -YNY -HIN -CJJ -SFS -CYU -CGM -JOL -SGS -SUG -TDG -WNP -BSO -SFE -TUG -VRC -CYP -CRM -MBT -RXS -TTG -LHS -OES -ING -GGS -SST -NEC -JDO -LEC -MEA -MII -VDC -RIA -TOW -ESR -ZPC -SOD -SCY -LOH -ESM -PSY -CRC -GLJ -LQM -LPD -NQU -PDA -EYP -GYA -PUR -RIB -REY -SRJ -ORG -MVS -LHC -CJA -HUU -NZC -SRA -MDO -MYC -VIG -JPR -BBQ -DSD -BBR -SFC -GBJ -NEV -VIJ -BQU -UNI -KOV -PPK -DZN -UKK -KSN -KVD -NAJ -CNN -PYJ -CKH -CYX -IKS -KXK -DYR -OHO -UJE -MPW -VSG -OZH -KWG -HRK -IFO -CWC -RWN -UDJ -CSH -CEE -AMV -KSZ -PES -GNA -MVQ -EIE -KYZ -NOZ -HTG -IAA -GRV -NAL -OGZ -ESL -WKK -BLF -GLH -PSC -KQA -LPS -SLY -HMA -NYA -OVS -IJK -KVX -NYM -RAT -NFG -KRO -LBD -AZN -FEG -NMA -NCU -UGC -KSQ -TMJ -RYB -EGO -URS -LPK -VKT -UUA -JOK -CSY -ULY -OSW -PEZ -SKX -BWO -HBX -KCT -WRZ -BBM -SHL -GAU -DMU -TEZ -BZL -OUI -BHR -BDP -MEY -KEP -GAN -HAQ -KDO -MAQ -BMV -HPH -CXR -VCS -VCA -DIN -UIH -PXU -VII -BMO -TVY -KAW -LIW -MNU -BSX -PKK -SWQ -TMC -BUI -SEH -TJS -DTD -BEJ -TJG -SMQ -LUV -ARD -BLG -LGL -ODN -MKM -BKM -LWY -BBN -TMG -KUD -TKG -HLP -NTX -PSU -SQG -PDO -LSW -PKG -LBW -NNX -LPU -ALH -GYL -AUU -BCI -BDD -BVI -BHQ -HTI -BEU -BRK -BUC -GIC -OKY -BQL -BHS -BLT -CVQ -CAZ -CPD -CNC -CNJ -CED -CTN -CMA -CNB -CUQ -OOM -DMD -NLF -DPO -ELC -EPR -FLS -GET -GLT -GTE -GFF -HID -HOK -MHU -HGD -JCK -KAX -KNS -KFG -KRB -KWM -KUG -LNO -LEL -LDH -IRG -LSY -LHG -LRE -LER -LVO -UBB -MKR -MIM -MGT -MNG -MCV -MQL -MMG -MRZ -MOV -MYA -MGB -ONG -MYI -MBH -NRA -NAA -NTN -ZNE -OLP -PUG -PMK -PBO -CCK -GOV -PKE -PLO -EDR -PQQ -PTJ -ULP -RAM -RMA -SGO -MJK -SBR -SRN -XTG -TCA -VCD -SYU -WNR -WYA -WUN -WOL -WIN -BWT -OKR -XMY -NAY -CIF -CIH -DAT -HET -BAV -SJW -TGO -HLH -XIL -BHY -CGD -DYG -MXZ -ZUH -LZH -ZHA -ENH -NNY -XFN -YIH -AKA -GOQ -HZG -IQN -XNN -ENY -UYN -AVK -LTI -BYN -DLZ -HVD -MXV -DIG -LUM -SYM -ZAT -KOW -JDZ -JIU -JUZ -LYG -HYN -LYI -JJN -TXN -WEF -WEH -WUX -WUS -WNZ -YNZ -YIW -HSN -BPX -DAX -GYS -LZO -MIG -NAO -LZY -WXN -AKU -IQM -KCA -KRL -KRY -YIN -HEK -JMU -JNZ -NDG -YNJ -WKL -WME -LRV -IOR -NNR -GTI -NBB -ORH -AQG -SHP -YCU -JGN -DSN -PWT -SPW -JEF -UNT -PVC -SBH -KMW -SUI -TBW -OBN -ERM -CVF -FUL -NVI -QSF -LRH -SUN -MCW -AZA -XAU -AKP -ANV -ATK -GAM -HPB -KAL -KSM -KVL -MYU -RBY -SHH -SVA -WTK -OMC -YPX -YTQ -ARC -QOW -FON -TMU -CYZ -KVK -GVR -PJA -QBC -HGR -ACR -GOP -SDP -HMI -WUZ -TBH -ACP -GBT -IIL -PFQ -TCG -MQM -AFS -DRG -LEN -RGS -EGM -CQD -DHM -NDC -SLV -IGG -KNW -KVC -PTH -TOG -EGN -LKH -WLH -CHG -UAS -BHG -YVB -SKT -PDP -WVB -MPA -AOE -CKZ -MSR -SIC -TEQ -YEI -LSS -KMV -VQS -YIF -HDM -MRQ -GFN -OAG -TRO -COQ -HOJ -ESC -YAK -GUL -CES -NSO -DGE -MTL -CPX -MWA -BMQ -OKB -KIK -IUD -GBZ -IMT -AET -MGC -SWD -GRM -AUW -MYP -LKS -MVA -QSA -WSY -MIE -LAF -VGT -ENW -MTJ -RIW -PDT -LYM -PKH -KTR -Australia -NOA -UKC -CEJ -TNL -BQT -OSH -AGE -EAT -ARE -RIN -UKX -RMT -QLS -ZJI -QNC -GDZ -IAR -OHE -JNG -DRK -NYT -ZXB -WUA -GYY -BRD -LWB -PGV -CYF -OXR -TEN -NIU -SCH -NBC -IAO -LGO -NLP -CKC -UST -NLV -RHP -STS -ISM -LCQ -LGU -BMC -MLD -ASE -ULV -ERV -GED -ZSW -GBN -HYS -SUS -LYU -GPZ -TVF -EGV -ARV -IKV -YBV -NGP -AVX -MHV -ZIN -INQ -SWT -HUT -STJ -NDZ -VOK -GUC -SIA -TOA -MBL -PGD -WFK -JHW -YTM -SME -SHD -DVL -DIK -SDY -CDR -AIA -MCK -MTH -GDV -OLF -WYS -ALS -CNY -ELY -VEL -SRR -SOW -MYL -SMN -MMH -FRD -ESD -AST -ONP -EMK -UNK -UUK -SHX -NUI -EEK -KUK -KWT -KWK -MLL -RSH -KGK -KMO -CIK -EAA -HUS -HSL -NUL -VEE -WBQ -CEM -SHG -IYK -VIS -MCE -CYR -CPQ -TWB -AYK -AGN -ELV -FNR -HNH -AFE -MTM -HYG -EGX -KPV -PIP -WSN -AKK -KYK -KLN -ABL -BKC -IAN -OBU -ORV -WLK -KTS -ELI -GLV -TLA -WAA -WMO -KKA -SMK -SKK -TNC -AKB -CYT -AUK -KPN -KFP -NLG -PML -KLW -KWN -KOT -KYU -SCM -NNL -KKH -NIB -AKI -AIN -APZ -RDS -PNT -SGV -IGB -NCN -TKJ -IRC -SLQ -HKB -AQC -MHM -MLY -YSO -YWB -YTF -YGV -YXK -XTL -XLB -XSI -YBT -ZGR -YCR -YRS -YOP -YBY -ZNA -YGG -YJM -YDT -ZEL -YFJ -RNI -BZA -RFS -SIU -WSP -PLD -COZ -NEG -RVR -SPB -ARR -JSM -UYU -ABF -ABN -DRJ -ICK -OEM -SMZ -TOT -AGI -CSC -ORJ -NAI -IMB -KAR -USI -MHA -PJC -ACD -RVE -VGZ -EBG -CAQ -COG -TLU -CFB -OPS -GRP -CMP -BVS -SFK -PIN -BRA -STZ -MQH -AUX -NVP -LVR -FRC -DOU -LBR -ROO -GPB -JCB -RVD -AAX -MBZ -RBB -CIZ -BAZ -DMT -GNM -QDJ -NZA -LBZ -AMC -GSQ -MRB -AWA -JIJ -MKS -DBM -DBT -QHR -GOB -MYB -MRE -RBX -CPA -MAX -BDI -WHF -PAF -HTY -RVV -ILD -BIU -GJR -SAK -IIA -TDK -ULG -VGD -LDG -HSK -CQM -NJF -CSA -RKH -AGC -FTY -TSO -TII -ZAJ -CCN -FUG -LCX -ACX -HZH -OSU -ADS -DTS -KHE -SZS -HJJ -YQI -ISO -FFA -CKS -MWK -PGU -YES -OSB -TJH -AXJ -KKX -AGJ -UGA -ULO -BPR -LBX -TJU -TAZ -BWB -DRB -WGE -BRT -DKI -LZR -HLT -HCQ -FIZ -RVT -PVU -SBS -DTA -RIF -PUC -LAM -HII -INW -DGL -MZK -AEA -AAK -KUC -AIS -TMN -BEZ -NIG -BBG -MTK -MNK -NON -TSU -WTZ -KTF -AFT -RNA -CHY -NNB -XYA -BOW -FTI -LVK -RMY -GFY -NDU -AGM -TRM -SMO -UDD -ZSY -OLM -DWA -RIL -SAA -PDK -BMG -SUA -MMU -APC -SDM -VNC -PHK -ECP -SBD -VAL -CAU -AWK -QNV -SQL -OSZ -RWI -SXQ -SEE -PHA -SQH -TKF -FRJ -GEX -RYY -4U9 -LVM -6S0 -BIV -HEN -LAL -SYH -IDL -RBK -FNU -MYQ -PCW -MGY -RID -FDY -PEA -EBE -EMP -ESX -BBP -SPF -QYD -OLV -ONQ -BJC -SLE -UTM -ZKB -LND -MWC -JVL -GKY -LZU -BWG -RVS -NHD -KGO -DBB -BCE -CKL -TCZ -UKS -JCI -ESN -HMR -MYV -DUC -UVA -LOT -CCR -OCA -YUS -YOO -LHA -SGH -MSI -HEX -CDA -JAB -HGS -TOP -NGQ -CSO -TKI -PWK -KLS -ZTA -PUE -KHC -UKA -ILN -AVW -CGZ -BXK -E63 -MMI -STK -RWL -YZY -CDW -AIZ -TVI -HSH -GML -TMA -QXR -DVT -YGE -YRV -HDO -ZHY -MCL -LHD -PPC -KHW -TXG -HLG -FZG -XYE -DWC -RKP -MVV -MFX -OKF -OKU -PSH -CKF -OMN -TTD -HIO -KHT -GAI -AZ3 -YTA -TSB -YSD -BNU -CVX -YCC -IZA -XFL -MVL -RBD -WST -BID -NME -OOK -OBY -VIN -BGE -ZKG -YBI -SPZ -WHP -MAE -YZZ -YAB -BCV -MPY -LDX -KJI -CPB -HMB -RVY -POJ -JTC -OIA -RDC -SXX -BYO -SXO -CFC -CAF -ERN -CCI -FBE -CFO -AAF -UMU -DTI -FBA -OLC -HUW -IRZ -ORX -UNA -TEF -GZP -DQH -FRP -TAN -PYM -OQU -OWD -BAF -IJD -MGJ -CXY -GHG -DXR -ASH -LWM -OXC -FIT -VPC -PYP -RMG -GAD -DKX -WDR -JYL -DNN -CTJ -LGC -MLJ -PIM -FFC -GVL -PHD -UDG -HHH -DNL -MRN -PBX -TOC -PLV -WUU -HUE -OYL -WYE -GBK -AFW -57C -RMK -LGH -RTS -KEW -YSP -YHF -YHN -YKX -YMG -YXZ -YEM -YFD -LWC -EGT -PMP -XMC -EET -YUE -LOP -ZML -HDG -UMP -LOZ -FBG -WMI -JXA -YGM -EYK -RAC -RZP -REI -RIR -TIW -JKA -HMJ -HIW -HZL -CBE -YBO -KLF -LNR -JOT -VYS -JXN -BBX -OBE -SEF -AVO -GIF -ZPH -OCF -JES -52A -CCO -HQU -AIK -CDN -LBT -SOP -RCZ -DLL -SVH -BUU -LHV -LPR -BKL -DKK -VAY -LDJ -ANQ -VNW -GVQ -CLW -CGX -JZP -CRE -IGQ -RNM -BXO -OEB -WBW -LNN -UMD -RLK -FFT -LEW -MRK -DRM -GDW -LWA -MFI -ISW -CWI -BVY -YRQ -POF -EPM -EOK -PSL -STP -SOO -VNA -DKS -BYT -ADY -GAS -HOA -KEY -ILU -ATJ -OVA -RGK -FLD -PCZ -STE -ERY -PEF -GQQ -TPN -PTZ -CKV -LPC -CTH -BST -LLK -GBB -ZTU -LKP -DEE -AOH -DSO -SSI -BFP -GGE -HDI -RNT -POC -CTY -CEU -BEC -PDG -GTU -QFO -SNY -GKL -RPB -IFL -BIN -MOO -ECA -JYO -VAM -LLF -LSZ -ONS -TDR -SDC -WBU -BBJ -PAO -FFZ -P08 -P52 -A39 -E25 -YTY -PTK -KSI -EEN -GKK -RCS -RHD -KMP -IOW -TLQ -MWM -ANP -FXO -ODO -ZTR -HRI -PEQ -HBG -QCJ -QSC -YKN -XSB -ZBM -KTI -GYU -CNI -KRH -CCL -HWD -MZP -JHQ -ARB -SHT -TEM -GAH -WIO -BFJ -ULK -GNY -KZR -VLU -BEO -4A7 -BMP -YCN -BJP -BQB -SEK -IVR -GLI -IMM -YIC -PTB -KGN -SBM -KFE -BJU -MZJ -GEU -SAD -KJP -SIK -TTI -GFL -5B2 -CGC -MTN -LHM -FZI -IZG -NEW -COE -BMT -DNV -COJ -TIX -NYE -AAP -FCM -LIX -OJC -GIU -EUM -TKT -YLK -YEE -NU8 -ND4 -NF4 -YCM -YPD -OQN -MNZ -KFS -2H0 -GXH -CIY -KVM -ZKP -UMS -ADH -NLT -BOR -FDW -OBC -TDJ -AQB -NOR -BTZ -DAW -WAR -EWK -BSJ -TZR -FBR -S40 -CLS -M94 -EVW -K83 -LRO -EUF -6J4 -MEO -AUO -CZG -EKY -A50 -MIC -23M -DBN -PUK -CVO -PXH -CWT -OGD -W63 -RKR -AKO -SHN -WNA -PKA -YBW -2A5 -WKR -GFO -DYL -TGI -TJL -OAL -OCW -7W6 -MHC -YEL -UKF -JZI -DAN -0V4 -ERG -CQW -BEM -NKT -SUY -OUZ -QUO -KAA -MBI -SGX -AOG -ZYI -HYW -LDS -AVA -KSS -WTB -TNH -SZV -LII -NTI -WSR -DTB -SSV -MEQ -BUW -KAZ -MNA -SGQ -OKL -KOX -CMQ -WMB -RCM -DCN -KNO -HBI -EMV -EMT -FAH -IXT -I16 -KRQ -SSF -JSV -JAS -87K -MRF -E38 -BQE -CZA -BUY -CCB -IOB -EKI -C03 -CUB -GMJ -MPR -GYH -PXE -HVS -IGX -SZT -DU9 -SUT -FCI -HNZ -LEE -PPY -DIQ -ERD -ERL -CNO -HTR -UYF -BWW -PRB -HAF -HCJ -WJF -CJF -GUZ -UBT -BOX -FYJ -TDF -PZL -KJH -HPG -YIE -HNY -WOS -IGT -ASN -GMU -MKT -NGD -TOI -SCD -EDN -ALX -PKT -GPN -HZP -UWL -TQK -HDE -PTT -AHQ -LXN -19S -CBF -OKK -2K7 -EHA -FTG -GBG -GUY -MEJ -ULS -IDP -3AU -LQR -LZZ -BYY -PRX -CFV -GXY -OEL -FET -LGD -SZY -MPO -UKT -YBA -BNG -OFK -AWO -TFL -TPF -BZC -ITP -KBN -IKL -AIR -JRN -JIA -VLP -JUA -CCX -BMB -QBX -APQ -FLB -PCS -BNC -BNB -MTP -VPZ -DRV -SXK -MLZ -PDU -ATI -HSM -SWH -TTL -KWB -KOO -AOU -N/A -SQX -LDM -RHV -OHS -RZS -TMF -IFU -KIE -YKO -BUT -TLI -TQL -BPL -ACS -WVI -GLU -JGG -DLK -KM8 -XTO -YSE -MRT -YAH -YAL - -YBU -YCE -YCP -YCQ -XRR -YDO -YEY -YGD -YHE -YHT -YDG -YJF -YKJ -YLR -YME -YML -YOS -YPS -YQS -YRO -YRP -YSH -YSL -YVD -YVE -YXQ -YSN -KES -XPK -ZGF -ZJG -YTD -PIW -XPP -WPC -ZST -ZUC -FNB -FSS -BXP -DGP -LMR -SXN -NDD -MAI -ADI -MWE -ALN -AXN -CLU -BBD -BIH -BKE -BPI -WMH -BTL -BYI -CCY -CNU -CRG -CSV -DAA -DAG -DMN -DRA -EED -EGI -EKA -HYI -HYR -JCT -LLQ -LOL -MBG -MCB -MDH -MMT -NHZ -NRB -OGB -OLU -OTM -OZR -PWY -POU -RNH -RSL -RWF -SNS -SOA -SUZ -TPH -UAO -UKI -UOX -HTV -VTN -WMC -WWR -XMR -ZZV -ECV -CDT -TEV -TN0 -QLP -BJY -RUV -XPL -UPL -QSN -SNJ -KMX -XXN -KNR -PYK -XIJ -MPD -ATG -SGI -RQW -ENN -WWA -QUT -IEJ -AAV -BPH -MXI -VMR -BAT -QHP -TOQ -LGR -CNR -TLX -ZIC -TTC -API -CVE -PAL -PZA -TQS -MQZ -RIJ -JAE -IKU -VYI -GVN -NLI -VLK -INA -ZIX -RTC -HIM -RDP -PUT -ABH -ARY -BLN -BZD -BWQ -CVC -CWW -CYG -CMD -DRN -DNQ -DYA -ECH -FRB -GUH -HXX -HTU -KRA -KPS -KGY -TGN -MRG -RPM -QRM -PPI -SIO -SNB -SWC -TYB -TUM -WGT -WKB -QRR -SXE -WWY -NGA -LHK -WDS -HTT -UUN -BFU -RUG -WHU -SXJ -YKH diff --git a/legacy/share/salt/README.md b/legacy/share/salt/README.md deleted file mode 100644 index f15d266..0000000 --- a/legacy/share/salt/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Opinionated example of deployment via Salt Stack - -## Assumptions: - * user & group srv:srv exist, this is used as a generic service runner - * you want to run the service on port 80, directly exposed to the interwebs (you really want to add a reverse SSL proxy in between) - * You have, or are willing to deploy Salt Stack. - * A bit of assembly is required since you need to move pillar.sls into your saltroot/pillar/ and the rest into saltroot/wttr/ - * You want metric-sm units. Just roll your own wegorc to change this - -## Caveats: - * Doesn't do enough to make a recent master checkout work, i.e. needs further improvement. Latest known working revision is 0d76ba4a3e112694665af6653040807835883b22 diff --git a/legacy/share/salt/init.sls b/legacy/share/salt/init.sls deleted file mode 100644 index 5994262..0000000 --- a/legacy/share/salt/init.sls +++ /dev/null @@ -1,112 +0,0 @@ -wttr: - service.running: - - enable: True - - watch: - - file: /srv/ephemeral/start.sh - - git: wttr-repo - - require: - - pkg: wttr-dependencies - - git: wttr-repo - - cmd: wego - - archive: geolite-db - -# package names are from Ubuntu 18.04, you may need to adjust if on a different distribution -wttr-dependencies: - pkg.installed: - - pkgs: - - golang - - gawk - - python-setuptools - - python-dev - - python-dnspython - - python-geoip2 - - python-geopy - - python-gevent - - python-flask - - python-pil - - authbind - -wttr-repo: - git.latest: - - name: https://github.com/chubin/wttr.in - - rev: master - - target: /srv/ephemeral/wttr.in - - require: - - /srv/ephemeral - -wttr-start: - file.managed: - - name: /srv/ephemeral/start.sh - - source: salt://wttr/start.sh - - mode: '0770' - - user: srv - - group: srv - -wegorc: - file.managed: - - name: /srv/ephemeral/.wegorc - - user: srv - - group: srv - - source: salt://wttr/wegorc - - template: jinja - - context: - apikey: {{ pillar['wttr']['apikey'] }} - -geolite-db: - archive.extracted: - - name: /srv/ephemeral - - source: http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz - - source_hash: http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz.md5 - - keep_source: True - - options: --strip-components=1 # flatten directory structure - - enforce_toplevel: False - -# Could benefit from improvement, won't get updated automatically at all -wego: - cmd.run: - - onlyif: 'test ! -e /srv/ephemeral/bin/wego' - - env: - - GOPATH: /srv/ephemeral - - name: go get -u github.com/schachmat/wego && go install github.com/schachmat/wego - - cwd: /srv/ephemeral/ - - require: - - pkg: wttr-dependencies - - file: wegorc - -/srv/ephemeral: - file.directory: - - makedirs: True - -{% for dir in '/srv/ephemeral/wttr.in/log','/srv/ephemeral/wttr.in/cache' %} -{{ dir }}: - file.directory: - - user: srv - - group: srv - - makedirs: True - - recurse: - - user - - group - - require_in: - - service: wttr -{% endfor %} - -/etc/systemd/system/wttr.service: - file: - - managed - - source: salt://wttr/wttr.service - - require: - - file: wttr-start - - file: authbind-80 - - require_in: - - service: wttr - -authbind-80: - file: - - managed - - name: /etc/authbind/byport/80 - - user: srv - - group: srv - - mode: 770 - - replace: False - - require: - - pkg: wttr-dependencies diff --git a/legacy/share/salt/pillar.sls b/legacy/share/salt/pillar.sls deleted file mode 100644 index 5b61ecc..0000000 --- a/legacy/share/salt/pillar.sls +++ /dev/null @@ -1,2 +0,0 @@ -wttr: - apikey: insert-api-key-here-and-make-this-pillar-available-to-salt diff --git a/legacy/share/salt/start.sh b/legacy/share/salt/start.sh deleted file mode 100755 index ef8a298..0000000 --- a/legacy/share/salt/start.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -export WEGORC="/srv/ephemeral/.wegorc" -export GOPATH="/srv/ephemeral" - -export WTTR_MYDIR="/srv/ephemeral/wttr.in" -export WTTR_GEOLITE="/srv/ephemeral/GeoLite2-City.mmdb" -export WTTR_WEGO="$GOPATH/bin/wego" - -export WTTR_LISTEN_HOST="0.0.0.0" -export WTTR_LISTEN_PORT="80" - -python $WTTR_MYDIR/bin/srv.py diff --git a/legacy/share/salt/wegorc b/legacy/share/salt/wegorc deleted file mode 100644 index 7f71c57..0000000 --- a/legacy/share/salt/wegorc +++ /dev/null @@ -1,58 +0,0 @@ -# wego configuration -# -# This config has https://github.com/schachmat/ingo syntax. -# Empty lines or lines starting with # will be ignored. -# All other lines must look like "KEY=VALUE" (without the quotes). -# The VALUE must not be enclosed in quotes as well! - -# aat-frontend: Show geo coordinates (default false) -aat-coords=false - -# aat-frontend: Monochrome output (default false) -aat-monochrome=false - -# BACKEND to be used (default forecast.io) -backend=forecast.io - -# NUMBER of days of weather forecast to be displayed (default 3) -days=3 - -# forecast backend: the api KEY to use (default ) -forecast-api-key={{ apikey }} - -# forecast backend: print raw requests and responses (default false) -forecast-debug=false - -# forecast backend: the LANGUAGE to request from forecast.io (default en) -forecast-lang=en - -# FRONTEND to be used (default ascii-art-table) -frontend=ascii-art-table - -# json frontend: do not indent the output (default false) -jsn-no-indent=false - -# LOCATION to be queried (default 40.748,-73.985) -location=40.748,-73.985 - -# openweathermap backend: the api KEY to use (default ) -owm-api-key= - -# openweathermap backend: print raw requests and responses (default false) -owm-debug=false - -# openweathermap backend: the LANGUAGE to request from openweathermap (default en) -owm-lang=en - -# UNITSYSTEM to use for output. -# Choices are: metric, imperial, si, metric-ms (default metric) -units=metric-ms - -# worldweatheronline backend: the api KEY to use (default ) -wwo-api-key= - -# worldweatheronline backend: print raw requests and responses (default false) -wwo-debug=false - -# worldweatheronline backend: the LANGUAGE to request from worldweatheronline (default en) -wwo-lang=en diff --git a/legacy/share/salt/wttr.service b/legacy/share/salt/wttr.service deleted file mode 100644 index a912e19..0000000 --- a/legacy/share/salt/wttr.service +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Wttr weather service - -[Service] -ExecStart=/usr/bin/authbind --deep /srv/ephemeral/start.sh -Restart=always - -[Install] -WantedBy=multi-user.target diff --git a/legacy/share/screenrc b/legacy/share/screenrc deleted file mode 100644 index 4e4167d..0000000 --- a/legacy/share/screenrc +++ /dev/null @@ -1,2 +0,0 @@ -screen -t srv.py bash -c "cd ~/wttr.in; ve/bin/python bin/srv.py; bash -i" -screen -t proxy.py bash -c "cd ~/wttr.in; ve/bin/python bin/proxy.py; bash -i" diff --git a/legacy/share/scripts/clean-cache.sh b/legacy/share/scripts/clean-cache.sh deleted file mode 100755 index 3ed9937..0000000 --- a/legacy/share/scripts/clean-cache.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -CACHEDIR="/wttr.in/cache" - -for dir in wego proxy-wwo png -do - mv "${CACHEDIR}/${dir}" "${CACHEDIR}/${dir}.old" - mkdir "${CACHEDIR}/${dir}" - rm -rf "${CACHEDIR}/${dir}.old" -done - -cd /wttr.in/log -mv main.log main.log.1 -touch main.log - diff --git a/legacy/share/scripts/start-screen.sh b/legacy/share/scripts/start-screen.sh deleted file mode 100755 index 9469de7..0000000 --- a/legacy/share/scripts/start-screen.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -SESSION_NAME=wttr.in -SCREENRC_PATH=$(dirname $(dirname "$0"))/screenrc - -screen -dmS "$SESSION_NAME" -c "$SCREENRC_PATH" - diff --git a/legacy/share/static/example-tmux-status-line.png b/legacy/share/static/example-tmux-status-line.png deleted file mode 100644 index 2f755f6..0000000 Binary files a/legacy/share/static/example-tmux-status-line.png and /dev/null differ diff --git a/legacy/share/static/example-wttr-v2.png b/legacy/share/static/example-wttr-v2.png deleted file mode 100644 index 153d88a..0000000 Binary files a/legacy/share/static/example-wttr-v2.png and /dev/null differ diff --git a/legacy/share/static/favicon.ico b/legacy/share/static/favicon.ico deleted file mode 100644 index e1aff98..0000000 Binary files a/legacy/share/static/favicon.ico and /dev/null differ diff --git a/legacy/share/static/malformed-response.html b/legacy/share/static/malformed-response.html deleted file mode 100644 index 52db901..0000000 --- a/legacy/share/static/malformed-response.html +++ /dev/null @@ -1,24 +0,0 @@ - -wttr.in - - - - -
-Sorry, we processed more than 1M requests today and we ran out of our datasource capacity.
-We hope to solve the problem as soon as possible, so you can enjoy
-your favourite weather service 24x365 even if it rains or snows.
-
-We will solve the problem as soon as possible.
- for the updates. 
-
-If you like to code (and you surely do), you can check the wttr.in repository
-to see how the scalability problem is (not yet) solved.
-
-
- - - - - - diff --git a/legacy/share/static/style.css b/legacy/share/static/style.css deleted file mode 100644 index 7f4b6ab..0000000 --- a/legacy/share/static/style.css +++ /dev/null @@ -1,18 +0,0 @@ -body { - background: black; - color: #bbbbbb; -} -pre { -/* font-family: source_code_proregular; */ - -/* -font-family: Courier New,Courier,Lucida Sans Typewriter,Lucida Typewriter,monospace; -font-size: 70%; -*/ - -/*font-family: Lucida Console,Lucida Sans Typewriter,monaco,Bitstream Vera Sans Mono,monospace; */ -/*Droid Sans Mono*/ -font-family: "Source Code Pro", "DejaVu Sans Mono", Menlo, "Lucida Sans Typewriter", "Lucida Console", monaco, "Bitstream Vera Sans Mono", monospace; -/*font-family: bitstream_vera_sans_monoroman;*/ -font-size: 75%; -} diff --git a/legacy/share/templates/index.html b/legacy/share/templates/index.html deleted file mode 100644 index 261feeb..0000000 --- a/legacy/share/templates/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -
-{{ body }}
-
- - diff --git a/legacy/share/test-thunder.txt b/legacy/share/test-thunder.txt deleted file mode 100644 index 14af157..0000000 --- a/legacy/share/test-thunder.txt +++ /dev/null @@ -1,37 +0,0 @@ -Prévisions météo pour: Test-Milon, France - -  _`/"".-.  Averse de pluie légère -  ,\_( ).  17 °C -  /(___(__)  ↙ 5 km/h -  ‘ ‘ ‘ ‘  14 km -  ‘ ‘ ‘ ‘  3.6 mm - ┌─────────────┐ -┌──────────────────────────────┬───────────────────────┤ sam. 09 juin├───────────────────────┬──────────────────────────────┐ -│ Matin │ Après-midi └──────┬──────┘ Soir │ Nuit │ -├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤ -│ Brume │ Nuageux │  _`/"".-.  Foyers orageux │  _`/"".-.  Averse de plui…│ -│  _ - _ - _ -  21 °C │  .--.  25-26 °C │  ,\_( ).  25-27 °C │  ,\_( ).  22 °C │ -│  _ - _ - _  ← 5-6 km/h │  .-( ).  ← 4-5 km/h │  /(___(__)  ↑ 4-6 km/h │  /(___(__)  → 5-9 km/h │ -│  _ - _ - _ -  19 km │  (___.__)__)  18 km │  ⚡‘‘⚡‘‘  16 km │  ‘ ‘ ‘ ‘  15 km │ -│ 0.0 mm | 0% │ 0.0 mm | 0% │  ‘ ‘ ‘ ‘  0.7 mm | 46% │  ‘ ‘ ‘ ‘  2.4 mm | 82% │ -└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘ - ┌─────────────┐ -┌──────────────────────────────┬───────────────────────┤ dim. 10 juin├───────────────────────┬──────────────────────────────┐ -│ Matin │ Après-midi └──────┬──────┘ Soir │ Nuit │ -├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤ -│  \ / Partiellement …│  \ / Partiellement …│  _`/"".-.  Averse de plui…│  _`/"".-.  Averse de plui…│ -│  _ /"".-.  22-24 °C │  _ /"".-.  25-27 °C │  ,\_( ).  24-26 °C │  ,\_( ).  21 °C │ -│  \_( ).  ↙ 9-10 km/h │  \_( ).  ↙ 13-19 km/h │  /(___(__)  ↙ 17-30 km/h │  /(___(__)  ↙ 15-31 km/h │ -│  /(___(__)  20 km │  /(___(__)  20 km │  ‚‘‚‘‚‘‚‘  17 km │  ‚‘‚‘‚‘‚‘  18 km │ -│ 0.0 mm | 0% │ 1.8 mm | 56% │  ‚’‚’‚’‚’  4.1 mm | 82% │  ‚’‚’‚’‚’  1.6 mm | 72% │ -└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘ - ┌─────────────┐ -┌──────────────────────────────┬───────────────────────┤ lun. 11 juin├───────────────────────┬──────────────────────────────┐ -│ Matin │ Après-midi └──────┬──────┘ Soir │ Nuit │ -├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤ -│  _`/"".-.  Pluie éparse à │ Nuageux │  _`/"".-.  Averse de plui…│  _`/"".-.  Averse de plui…│ -│  ,\_( ).  21 °C │  .--.  24-26 °C │  ,\_( ).  23-25 °C │  ,\_( ).  20 °C │ -│  /(___(__)  ↑ 14-23 km/h │  .-( ).  ↑ 18-22 km/h │  /(___(__)  ↗ 13-23 km/h │  /(___(__)  ↗ 10-21 km/h │ -│  ‘ ‘ ‘ ‘  18 km │  (___.__)__)  18 km │  ‚‘‚‘‚‘‚‘  14 km │  ‚‘‚‘‚‘‚‘  14 km │ -│  ‘ ‘ ‘ ‘  0.1 mm | 22% │ 0.0 mm | 0% │  ‚’‚’‚’‚’  5.2 mm | 73% │  ‚’‚’‚’‚’  5.3 mm | 72% │ -└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘ diff --git a/legacy/share/translation.txt b/legacy/share/translation.txt deleted file mode 100644 index b650012..0000000 --- a/legacy/share/translation.txt +++ /dev/null @@ -1,76 +0,0 @@ -wttr.in is translated in NUMBER_OF_LANGUAGES languages: - - SUPPORTED_LANGUAGES - -Translated/improved/corrected by: - - * Afrikaans: Casper Labuschage @casperl (on github) - * Arabic Besher Aladdam @akai54 (on github) - * Armenian: Aram Bayadyan @aramix, Mikayel Ghazaryan @mkdotam, - Grigor Khachatryan @grigortw - * Azerbaijani: Dmytro Nikitiuk, Elsevar Abbasov, - Eldar Velibekov (@welibekov on github) - * Basque: Iker Sagasti (@isagasti on github) - * Belarusian: Igor Chubin, Anton Zhavoronkov @edogby (on github) - * Bosnian: Ismar Kunc @ismarkunc - * Bulgarian: Vladimir Vitkov @zeridon (on github) - * Brazilian-PT: Tupã Negreiros @TupaNegreiros (on github) - * Catalan: Angel Jarabo @legna29A - * Chinese(Traditional): Jeff Huang - * Chinese(Simplified): YouthLin Chen(@YouthLin on github), Junhan (@junhan-z on github), - Felix Wong (@gnowxilef on github) - * Croatian: Siniša Kusić @ku5ic - * Czech: Juraj Kakody - * Danish: Kim Schulz @kimusan (on github) - * Dutch: Youri Claes - * Esperanto: Igor Chubin - * Estonian: Jaan Jänesmäe @janesmae (on github) - * Finnish: @Maxifi - * French: Igor Chubin, @daftaupe, @iago-lito - * Frisian: Anne Douwe Bouma @anned20 (on github) - * German: Igor Chubin, @MAGICC (https://kthx.at) - * Greek: Panayotis Vryonis and @Petewg (on github) - * Hebrew: E.R. - * Hindi: Aakash Gajjar @skyme5 (gh) - * Hungarian: Mark Petruska - * Icelandic: Óli G. @dvergur, Skúli Arnlaugsson @Arnlaugsson - * Indonesian: Andria Arisal @andria009 - * Interlingua: Dustin Redmond @dustinkredmond (on github) - * Irish: Robert Devereux @RobertDev (gh), Conor O'Callaghan @ivernus (gh) - * Italian: Diego Maniacco - * Japanese: @ryunix - * Kazakh: Akku Tutkusheva, Oleg Tropinin - * Korean: Jeremy Bae @opt9, Jung Winter @res_tin - * Latvian: Gunārs Danovskis - * Macedonian: Matej Plavevski @MatejMecka - * Norwegian: Fredrik Fjeld @fredrikfjeld - * Nynorsk: Kevin Brubeck Unhammer (https://unhammer.org/k/) - * Occitan: Quentin PAGÈS @Quenty-tolosan (gh) - * Persian: Javad @threadripper_ - * Polish: Wojtek Łukasiewicz @wojtuch (on github) - * Portuguese: Fernando Bitti Loureiro @fbitti (on github) - * Romanian: Gabriel Moruz - * Russian: Igor Chubin - * Serbian: Milan Stevanović @FathVader - * Slovak: Juraj Kakody - * Slovenian: B.S. - * Spanish: Fernando Bitti Loureiro @fbitti (on github) - * Swedish: John Eriksson - * Swahili: Joel Mukuthu - * Turkish: Atabey Kaygun, Yilmaz @edigu, Volkan Tokmak(@volkanto) - * Thai: Vatunyoo Suwannapisit @kerlos - * Ukrainian: Igor Chubin, Serhiy @pavse - * Uzbek: Shukhrat Mukimov - * Vietnamese: Lưu Vĩnh Phúc @phuclv90 (on github) - * Welsh: Daniel Thomas - -and many many others. - -In the not likely case wttr.in is not yet translated in your language -you can help with the translation. -Please start with one of the following steps: - - * Open a GitHub issue: github.com/chubin/wttr.in - * Write an email to igor@chub.in - * Write PM or tweet to igor_chubin - diff --git a/legacy/share/translations/af-help.txt b/legacy/share/translations/af-help.txt deleted file mode 100644 index e213628..0000000 --- a/legacy/share/translations/af-help.txt +++ /dev/null @@ -1,68 +0,0 @@ -Gebruik: - - $ curl wttr.in # huidige ligging - $ cur wttr.in/muc # weerberig in München se lughawe - -Ondersteunde soorte ligging: - - /paris # stadsnaam - /~Eiffel+tower # enige ligging - /Москва # Unikode naam van enige ligging in enige taal - /muc # lughawe kode (3 letters) - /@stackoverflow.com # domeinnaam - /94107 # gebiedskodes - /-78.46,106.79 # GPS koördinate - -Besondere liggings: - - /moon # Fase van die maan (voeg +US of ,+France by vir daardie stede) - /moon@2016-10-25 # Fase van die maan vir die datum (@2016-10-25) - -Eenhede: - - m # metrike (SI) (word orals gebruik behalwe vir die VSA) - u # USCS (gebruik in die VSA) - M # vertoon die spoed van die wind in m/s - -Besigtig keuses: - - 0 # slegs die huidige weer - 1 # huidige weer + 1 dag - 2 # huidige weer + 2 dae - F # moet nie die "Volg" lyn wys nie - n # smal weergawe (slegs dag en nag) - q # stil weergawe (geen "Weerberig" teks nie) - Q # baie stil weergawe (geen "Weerberig), geen stadsnaam - T # skakel terminaal kodes af (geen kleur) - -PNG keuses: - - /paris.png # skep 'n PNG leêr - p # voeg 'n raam by rondom die uitset - t # deursigtigheid 150 - transparency=... # deursigtigheid vanaf 0 tot 255 (255 = nie deursigtig nie) - -Keuses can saamgevoeg word - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # met PNG word die lêer mode daarna gegee - /Rome_0pq_lang=it.png # lang keuses word met 'n onderstreping verdeel - -Lokalisering: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Ondersteunde tale: - - FULL_TRANSLATION (word ondersteun) - PARTIAL_TRANSLATION (in wording) - -Spesiale URLe: - - /:help # vertoon hierdie bladsy - /:bash.function # vertoon aanbeveling vir bash funksie wttr() - /:translation # vertoon die besonderhede van die vertalers - diff --git a/legacy/share/translations/af.txt b/legacy/share/translations/af.txt deleted file mode 100644 index c80c3db..0000000 --- a/legacy/share/translations/af.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Helder : Clear -113: Sonnig : Sunny -116: Gedeeltelik bewolk : Partly cloudy -119: Bewolk : Cloudy -122: Oortrokke : Overcast -143: Mis toestande : Mist -176: Gedeeltelike reën moontlik : Patchy rain possible -179: Gedeeltelike sneeu moontlik : Patchy snow possible -182: Gedeeltelike ysreën moontlik : Patchy sleet possible -185: Gedeeltelik ysige motreën moontlik : Patchy freezing drizzle possible -200: Donderbuie moontlik : Thundery outbreaks possible -227: Waaiende sneeu : Blowing snow -230: Sneeustorm : Blizzard -248: Mis toestande : Fog -260: Vriesende mis toestande : Freezing fog -263: Gedeeltelike ligte motreën : Patchy light drizzle -266: Ligte motreën : Light drizzle -281: Vriesende motreën : Freezing drizzle -284: Erg vriesende motreën : Heavy freezing drizzle -293: Gedeeltelike ligte reën : Patchy light rain -296: Ligte reën : Light rain -299: Matige reën by tye : Moderate rain at times -302: Matige reën : Moderate rain -305: Swaar reën by tye : Heavy rain at times -308: Swaar reën : Heavy rain -311: Ligte vriesende reën : Light freezing rain -314: Matige tot swaar vriesende reën : Moderate or heavy freezing rain -317: Ligte ysreën : Light sleet -320: Matige tot swaar ysreën : Moderate or heavy sleet -323: Verspreide ligte sneeu : Patchy light snow -326: Ligte sneeu : Light snow -329: Verspreide ligte sneeu : Patchy moderate snow -332: Matige sneeu : Moderate snow -335: Verspreide swaar sneeu : Patchy heavy snow -338: Swaar sneeu : Heavy snow -350: Haelkorrels : Ice pellets -353: Ligte bui reën : Light rain shower -356: Matige tot swaar bui reënbui : Moderate or heavy rain shower -359: Stortreën : Torrential rain shower -362: Ligte buie ysreën : Light sleet showers -365: Ligte tot swaar buie ysreën : Moderate or heavy sleet showers -368: Ligte buie sneeu : Light snow showers -371: Ligte tot swaar buie sneeu : Moderate or heavy snow showers -386: Verspreide ligte buie en donderbuie : Patchy light rain with thunder -389: Ligte tot swaar buie en donderbuie : Moderate or heavy rain with thunder -392: Verspreide ligte sneeu met donderbuie : Patchy light snow with thunder -395: Matige of swaar sneeu met donderbuie : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/ar-help.txt b/legacy/share/translations/ar-help.txt deleted file mode 100644 index d2ef7be..0000000 --- a/legacy/share/translations/ar-help.txt +++ /dev/null @@ -1,69 +0,0 @@ -الإستخدام: - - $ curl wttr.in # الموقع الحالي - $ curl wttr.in/muc # الطقس في مطار ميونخ - -أنواع الأماكن المدعومة: - - /paris # أسم المدينة - /~Eiffel+tower # أي مكان - /Москва # أسم يونيكود ﻷي مكان بأي لغة - /muc # airport code (3 letters) - /@stackoverflow.com # أسم النطاق -/94107 # رمز المنطقة - /-78.46,106.79 # GPS إحداثيات الـ - -الأماكن الخاصة: - - /moon # مرحلة القمر (أضف ,+US أو ,+France لهؤلاء المدن) - /moon@2016-10-25 # مرحلة القمر بتاريخ (@2016-10-25) - -الوحدات: - - m # المتريّ (SI) (يستخدم في العادة في كل الأماكن ما عدا الولايات المتحدة) - u # وحدات القياس العرفية الأمريكية (يستخدم في العادة في الولايات المتحدة) - M # إظهار سرعة الرياح بوحدة م/ث - -خيارات العرض: - - 0 # فقط الطقس الحالي - 1 # الطقس الحالي + 1 يوم - 2 # الطقس الحالي + 2 يوم - A # تجاهل الوكيل المستخدم وقم بإجبار تنسيق المعهد القومى الأمريكى للتنميط (الطرفية) - F # "لا تظهر سطر "المتابعة - n # النسخة الضيقة (النهار والليل فقط) - q # النسخة الصامتة (من غير عبارة "تقرير جوي") - Q # النسخة الصامتة كليا (من غير عبارة "تقرير جوي", من غير أسم المدينة) - T # إطفاء تسلسل الطرفية (من غير ألوان) - - PNG خيارات: - - /paris.png # png إنشاء صورة بصيغة - p # إضافة إطار حول المخرج - t # الشفافية 150 - transparency=... # الشفافية من 0 إلي 255 (255 = غير شفاف) - -يمكن جمع الخيارات: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # خيار الملف يتم تحديده في ما بعد PNG في - /Rome_0pq_lang=it.png # الخيارات الطويلة يتم فصلهم عن طريق شرطة سفلية - -حصر المكان: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -اللغات المدعومة: - - FULL_TRANSLATION (مدعومة) - PARTIAL_TRANSLATION (جار العمل) - -روابط URLs خاصة : - - /:help # إظهار هذه الصفحة - /:bash.function # wttr() bash إظهار الميزة الخاصةبـ - /:translation # إظهار المعلومات حول المترجمين - diff --git a/legacy/share/translations/ar.txt b/legacy/share/translations/ar.txt deleted file mode 100644 index c9520b6..0000000 --- a/legacy/share/translations/ar.txt +++ /dev/null @@ -1,80 +0,0 @@ -113: صَافٍ : Clear -113: مُشْمِسٌ : Sunny -116: غَائِمٌ جزئياً‏ : Partly cloudy -119: غَائِمٌ : Cloudy -122: مُلبَّد بالغُيُوم : Overcast -143: ضَبَاب خَفيف : Mist -176: مِنَ الْمُمْكِنِ هُطول أمطار متفرِّقة : Patchy rain possible -179: مِنَ الْمُمْكِنِ هُطول ثُلُوج متفرِّقة : Patchy snow possible -182: مِنَ الْمُمْكِنِ هُطول المطر الثلجي متفرِّقة : Patchy sleet possible -185: مِنَ الْمُمْكِنِ هُطول أمطار متفرِّقة : Patchy freezing drizzle possible -200: مِنَ الْمُمْكِنِ ظُهورَ الرَعد : Thundery outbreaks possible -227: ثُلُوج غَزِيْرَةُ : Blowing snow -230: عاصِفة ثلجية : Blizzard -248: ضَّبَابُ كَثيف : Fog -260: ضَّبَابُ جامِد : Freezing fog -263: رَّذاذُ مَطَرِ متفرِّق : Patchy light drizzle -266: رَّذاذُ مَطَرِ : Light drizzle -281: رَّذاذُ مُتَجمَّد : Freezing drizzle -284: رَّذاذُ مُتَجمَّد غَزير : Heavy freezing drizzle -293: أمطار خَفيفة متفرِّقة : Patchy light rain -296: أمطار خَفيفة : Light rain -299: أمطار مُعْتَدِلَةُ في بَعْضِ الأوْقات : Moderate rain at times -302: أمطار مُعْتَدِلَةُ : Moderate rain -305: أمطار كَثيفة في بَعْضِ الأوْقات : Heavy rain at times -308: أمطار كَثيفة : Heavy rain -311: أمطار مُتَجمَّدة خَفيفة : Light freezing rain -314: أمطار مُتَجمَّدة مُعْتَدِلَةُ أو كَثيفة : Moderate or heavy freezing rain -317: مطر ثلجي خَفيف : Light sleet -320: مطر ثلجي مُعْتَدِلَ أو كَثيف : Moderate or heavy sleet -323: ثُلُوج خَفيفة متفرِّقة : Patchy light snow -326: ثُلُوج خَفيفة : Light snow -329: ثُلُوج مُعْتَدِلَةُ متفرِّقة : Patchy moderate snow -332: ثُلُوج مُعْتَدِلَةُ : Moderate snow -335: ثُلُوج كَثيفة متفرِّقة : Patchy heavy snow -338: ثُلُوج كَثيفة : Heavy snow -350: حُبَيْبات جليدية : Ice pellets -353: رَّذاذُ مَطَرٌ خَفِيف : Light rain shower -356: رَّذاذُ مَطَرٌ مُعْتَدِلَ أو كَثيف : Moderate or heavy rain shower -359: رَّذاذُ مطر غَزِيْرَ : Torrential rain shower -362: رَّذاذُ مطر ثلجي خَفيف : Light sleet showers -365: رَّذاذُ مطر ثلجي مُعْتَدِلَ أو كَثيف : Moderate or heavy sleet showers -368: رَّذاذُ ثلجي خَفيف : Light snow showers -371: رَّذاذُ ثلجي خَفيف : Moderate or heavy snow showers -386: أمطار خَفيفة متفرِّقة مَصحوبة بالرَعد : Patchy light rain with thunder -389: أمطار مُعْتَدِلَةُ أو كَثيفة متفرِّقة مَصحوبة بالرَعد : Moderate or heavy rain with thunder -392: ثُلُوج خَفيفة متفرِّقة مَصحوبة بالرَعد : Patchy light snow with thunder -395: ثُلُوج مُعْتَدِلَةُ أو كَثيفة متفرِّقة مَصحوبة بالرَعد : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/az.txt b/legacy/share/translations/az.txt deleted file mode 100644 index 7cc6cd7..0000000 --- a/legacy/share/translations/az.txt +++ /dev/null @@ -1,48 +0,0 @@ -113: Aydınlı : Clear : Ясно -113: Günəşli : Sunny : Солнечно -116: Dəyişkən buludlu : Partly cloudy : Переменная облачность -119: Buludlu : Cloudy : Облачно -122: Buludlu : Overcast : Пасмурно -143: Çən : Mist : Дымка -176: Bəzi yerlərdə yagış : Patchy rain possible : Местами дождь -179: Bəzi yerlərdə qar : Patchy snow possible : Местами снег -182: Bəzi yerlərdə qar və yagış : Patchy sleet possible : Местами дождь со снегом -185: Bəzi yerlərdə soyuq çisklinli hava : Patchy freezing drizzle possible : Местами замерзающая морось -200: Bəzi yerlərdə tufan : Thundery outbreaks possible : Местами грозы -227: Yüngül küləkli qar : Blowing snow : Поземок -230: Çovqun : Blizzard : Метель -248: Duman : Fog : Туман -260: Güclü soyuq duman : Freezing fog : Переохлажденный туман -263: Bəzi yerlərdə zəif çiskin : Patchy light drizzle : Местами слабая морось -266: zəif çiskin : Light drizzle : Слабая морось -281: Soyuq çiskin : Freezing drizzle : Замерзающая морось -284: Güclü soyuq çiskin : Heavy freezing drizzle : Сильная замерзающая морось -293: Bəzi yerlərdə yüngül yagış : Patchy light rain : Местами небольшой дождь -296: Yüngül yagiş : Light rain : Небольшой дождь -299: Bəzi vaxtlarda mülayim yagış : Moderate rain at times : Временами умеренный дождь -302: Mülayim yagış : Moderate rain : Умеренный дождь -305: Bəzi vaxtlarda güclü yagış : Heavy rain at times : Временами сильный дождь -308: Güclü yagış : Heavy rain : Сильный дождь -311: Zəif soyuq yagış : Light freezing rain : Слабый переохлажденный дождь -314: Mülayim yaxud güclü soyuq yagış : Moderate or heavy freezing rain : Умеренный или сильный переохлажденный дождь -317: Yüngül yagış və qar : Light sleet : Небольшой дождь со снегом -320: Mülayim yaxud güclü yagış və qar : Moderate or heavy sleet : Умеренный или сильный дождь со снегом -323: Bəzi yerlərdə yüngül qar : Patchy light snow : Местами небольшой снег -326: Yüngül qar : Light snow : Небольшой снег -329: Bəzi yerlərdə mülayim qar : Patchy moderate snow : Местами умеренный снег -332: Mülayim qar : Moderate snow : Умеренный снег -335: Bəzi yerlərdə güclü qar : Patchy heavy snow : Местами сильный снег -338: Güclü qar : Heavy snow : Сильный снег -350: Buzlu yagış : Ice pellets : Ледяной дождь -353: Yüngül leysanlı yagış : Light rain shower : Небольшой ливневый дождь -356: Mülayim yaxud güclü leysanlı yagış : Moderate or heavy rain shower : Умеренный или сильный ливневый дождь -359: Çox güclü leysan : Torrential rain shower : Очень сильный ливень -362: Yüngül leysanlı yagış və sulu qar : Light sleet showers : Небольшой ливневый дождь со снегом -365: Yüngül qar : Moderate or heavy sleet showers : Небольшой снег -368: Yüngül leysanlı yagış və qar : Light snow showers : Небольшой ливневый дождь со снегом -371: Mülayim yaxud güclü qarlı leysan : Moderate or heavy snow showers : Умеренный или сильный снежный ливень -386: Bəzi yerlərdə yüngül tufan və yagış: Patchy light rain with thunder : Местами небольшой дождь с грозой -389: Mülayim yaxud güclü yagış və tufan : Moderate or heavy rain with thunder : Умеренный или сильный дождь с грозой -392: Bəzi yerlərdə yüngül tufan və qar : Patchy light snow with thunder : Местами небольшой снег с грозой -395: Mülayim yaxud güclü qar və tufan : Moderate or heavy snow with thunder : Умеренный или сильный снег с грозой - diff --git a/legacy/share/translations/be-help.txt b/legacy/share/translations/be-help.txt deleted file mode 100644 index 7373c94..0000000 --- a/legacy/share/translations/be-help.txt +++ /dev/null @@ -1,69 +0,0 @@ -Выкарыстанне: - - $ curl wttr.in # надвор'е ў вашым месцы - $ curl wttr.in/msq # надвор'е ў аэрапорце Мінск - -Магчымыя тыпы месцазнаходжання: - - /novaja-mysz # населены пункт - /~dipgorodok # якое-небудзь месца - /жабінка # назва якога-небудзь месца юнікодам на нейкай мове - /gme # трохлітарны код аэрапорта - /@osm.by # даменнае імя - /220121 # паштовы індэкс - /53.953994,27.537774 # каардынаты GPS - -Адмысловыя месцазнаходжанні: - - /moon # Фаза месяца (дадайце ,+US або ,+France для горада Moon у ЗША або ў Францыі) - /moon@2016-10-25 # Фаза Месяца для гэтай даты (@2016-10-25) - -Адзінкі вымярэння: - - m # метрычная (СІ) (звычайна ўжываецца паўсюль акрамя ЗША) - u # USCS (ўжываецца ў ЗША) - M # паказваць хуткасць ветру ў м/с - -Опцыі прагляду: - - 0 # толькі надвор'е цяпер - 1 # надвор'е цяпер + 1 дзень - 2 # надвор'е цяпер + 2 дні - A # не зважаць на User-Agent і мусова ўжываць фармат вываду ANSI (як у тэрмінале) - F # не паказваць радок "Сачыце за навінамі" - n # вузкая версія (толькі дзень і ноч) - q # ціхая версія (без тэксту "Прагноз надвор'я для") - Q # надта ціхая версія (без "Прагноз надвор'я для", без назвы месца) - T # выключыць паслядоўнасці тэрміналу (без колераў) - -Опцыі PNG: - - /szklow.png # выдаць файл PNG - p # дадаць рамку вакол - t # празрыстасць 150 - transparency=... # празрыстасць ад 0 да 255 (255 = непразрыста) - -Опцыі можна спалучаць: - - /iuje?pq - /dzvinsk?0pq&lang=be - /bielastok_0pq.png # для PNG опцыі падаюцца пасля знаку _ - /turau_0pq_lang=be.png # доўгія опцыі адасабляюцца знакам _ - -Лакалізацыя: - - $ curl be.wttr.in/Minsk - $ curl wttr.in/minsk?lang=be - $ curl -H "Accept-Language: be" wttr.in/minsk - -Даступныя мовы: - - FULL_TRANSLATION (падтрымліваюцца) - PARTIAL_TRANSLATION (не цалкам) - -Адмысловыя адрасы: - - /:help # паказаць гэтую старонку - /:bash.function # паказаць рэкамендаваную функцыю bash wttr() - /:translation # паказаць спіс перакладаў - diff --git a/legacy/share/translations/be.txt b/legacy/share/translations/be.txt deleted file mode 100644 index 0ca117d..0000000 --- a/legacy/share/translations/be.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Ясна : Clear : -113: Сонечна : Sunny : -116: Пераменная воблачнасць : Partly cloudy : -119: Воблачнасць : Cloudy : -122: Хмарна : Overcast : -143: Смуга : Mist : -176: Месцамі дождж : Patchy rain possible : -179: Месцамі снег : Patchy snow possible : -182: Месцамі дождж са снегам : Patchy sleet possible : -185: Месцамі сцюдзёная імжа : Patchy freezing drizzle possible : -200: Месцамі навальніцы : Thundery outbreaks possible : -227: Нізавая завіруха : Blowing snow : -230: Мяцеліца : Blizzard : -248: Туман : Fog : -260: Сцюдзёны туман : Freezing fog : -263: Месцамі невялікая імжа : Patchy light drizzle : -266: Невялікая імжа : Light drizzle : -281: Сцюдзёная імжа : Freezing drizzle : -284: Моцная сцюдзёная імжа : Heavy freezing drizzle : -293: Месцамі невялікі дождж : Patchy light rain : -296: Невялікі дождж : Light rain : -299: Часам умераны дождж : Moderate rain at times : -302: Умераны дождж : Moderate rain : -305: Часам моцны дождж : Heavy rain at times : -308: Моцны дождж : Heavy rain : -311: Невялікі сцюдзёны дождж : Light freezing rain : -314: Умераны ці моцны сцюдзёны дождж : Moderate or heavy freezing rain : -317: Невялікі дождж са снегам : Light sleet : -320: Умераны ці моцны дождж са снегам : Moderate or heavy sleet : -323: Месцамі невялікі снег : Patchy light snow : -326: Невялікі снег : Light snow : -329: Месцамі умераны снег : Patchy moderate snow : -332: Умераны снег : Moderate snow : -335: Месцамі моцны снег : Patchy heavy snow : -338: Моцны снег : Heavy snow : -350: Ледзяны дождж : Ice pellets : -353: Слабы ліўневы дождж : Light rain shower : -356: Умераны ці моцны ліўневы дождж : Moderate or heavy rain shower : -359: Вельмі моцны ліўневы дождж : Torrential rain shower : -362: Невялікі ліўневы дождж са снегам : Light sleet showers : -365: Умераны ці моцны ліўневы дождж са снегам : Moderate or heavy sleet showers : -368: Невялікі ліўневы снег : Light snow showers : -371: Умераны ці моцны ліўневы снег : Moderate or heavy snow showers : -386: Месцамі невялікі дождж з навальніцай : Patchy light rain with thunder : -389: Умераны ці моцны дождж з навальніцай : Moderate or heavy rain with thunder : -392: Месцамі невялікі снег з навальніцай : Patchy light snow with thunder : -395: Умераны ці моцны снег з навальніцай : Moderate or heavy snow with thunder : diff --git a/legacy/share/translations/bg-help.txt b/legacy/share/translations/bg-help.txt deleted file mode 100644 index c82756a..0000000 --- a/legacy/share/translations/bg-help.txt +++ /dev/null @@ -1,69 +0,0 @@ -Употреба: - - $ curl wttr.in # текущо местоположение - $ curl wttr.in/sof # времето на Софийското летище - -Поддържани типове местоположения: - - /paris # име на град - /~Eiffel+tower # място/забележителност - /Москва # Юникод име на местоположение - /sof # Код на летище (3 букви) - /@stackoverflow.com # име на домейн - /94107 # пощенски код - /-78.46,106.79 # GPS координати - -Специални местоположение: - - /moon # Фаза на луната (добавете ,+US or ,+France за тези места) - /moon@2016-10-25 # Фаза на луната за дата (@2016-10-25) - -Мерни единици: - - m # метрични (SI) (по подразбиране навсякъде извън US) - u # USCS (използвани по подразбиране в US) - M # покажи скоростта на вятъра в m/s - -Възможности на изгледа: - - 0 # само текущото време - 1 # текущо време + 1 ден - 2 # текущо време + 2 дни - A # игнорирай User-Agent и форсирай ANSI формат (за терминал) - F # не показвай реда "Следвай" - n # тясна версия (само ден и нощ) - q # тиха версия (без текст "Прогноза за времето") - Q # свръх тиха версия(без "Прогноза за времето", без име на местоположение) - T # изключи терминалните настройки (без цветове) - -PNG възможности: - - /paris.png # генериране на PNG - p # Сложи рамка около резултата - t # полупрозрачен фон 150 - transparency=... # полупрозрачен фон от 0 до 255 (255 = непрозрачно) - -Опциите могат да се комбинират: - - /Paris?0pq - /Paris?0pq&lang=bg - /Paris_0pq.png # при генериране на PNG възможностите са отделени с _ - /Rome_0pq_lang=bg.png # дългите опции са разделени с подчертавка - -Локализация: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=bg - $ curl -H "Accept-Language: bg" wttr.in/paris - -Поддържани преводи: - - FULL_TRANSLATION (Напълно преведени) - PARTIAL_TRANSLATION (В процес на превод) - -Специални Адреси (URL): - - /:help # тази страница - /:bash.function # препоръчителна bash функция wttr() - /:translation # покажи информация за преводачите - diff --git a/legacy/share/translations/bs.txt b/legacy/share/translations/bs.txt deleted file mode 100644 index 47f98f0..0000000 --- a/legacy/share/translations/bs.txt +++ /dev/null @@ -1,47 +0,0 @@ -113 : Vedro : Clear -113 : Sunčano : Sunny -116 : Djelomična naoblaka : Partly cloudy -119 : Oblačno : Cloudy -122 : Tmurno : Overcast -143 : Magla : Mist -176 : Moguća je slaba kiša : Patchy rain possible -179 : Moguć slab snijeg : Patchy snow possible -182 : Moguća je slaba susnježiva : Patchy sleet possible -185 : Moguća je ledena sitna kiša : Patchy freezing drizzle possible -200 : Moguća je grmljavina : Thundery outbreaks possible -227 : Topljenje snijega : Blowing snow -230 : Snježna mećava : Blizzard -248 : Magla : Fog -260 : Ledena magla : Freezing fog -263 : Mjestimično sitna kiša : Patchy light drizzle -266 : Sitna kiša : Light drizzle -281 : Ledena sitna kiša : Freezing drizzle -284 : Teško zamrzavanje : Heavy freezing drizzle -293 : Mjestimično slaba kiša : Patchy light rain -296 : Blaga kiša : Light rain -299 : Ponekad umjerena kiša : Moderate rain at times -302 : Umjerena kiša : Moderate rain -305 : Ponekad je kiša : Heavy rain at times -308 : Pljusak : Heavy rain -311 : Kruta kiša : Light freezing rain -314 : Umjerena ili teška hladna kiša : Moderate or heavy freezing rain -317 : Lagana susnježica : Light sleet -320 : Umjerena ili jaka susnježica : Moderate or heavy sleet -323 : Mjestimično slab snijeg : Patchy light snow -326 : Slab snijeg : Light snow -329 : Mjestimično blag snijeg : Patchy moderate snow -332 : Umjeren snijeg : Moderate snow -335 : Umjereno jak snijeg : Patchy heavy snow -338 : Jak snijeg : Heavy snow -350 : Grad/tuča : Ice pellets -353 : Lagani pljusak : Light rain shower -356 : Umjeren ili jak pljusak : Moderate or heavy rain shower -359 : Prolom oblaka : Torrential rain shower -362 : Slaba kiša sa gradom : Light sleet showers -365 : Umjerena ili jaka kiša sa gradom : Moderate or heavy sleet showers -368 : Blaga susnježica : Light snow showers -371 : Umjerena ili jaka susnježica : Moderate or heavy snow showers -386 : Slaba kiša s grmljavinom : Patchy light rain with thunder -389 : Umjerena ili jaka kiša s grmljavinom : Moderate or heavy rain with thunder -392 : Slabi snijeg s grmljavinom : Patchy light snow with thunder -395 : Umjereni ili teški snijeg s grmljavinom : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/ca-help.txt b/legacy/share/translations/ca-help.txt deleted file mode 100644 index e7be16e..0000000 --- a/legacy/share/translations/ca-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Instruccions: - - $ curl wttr.in # el clima de la ubicació actual - $ curl wttr.in/muc # el clima de l'aeroport de Múnich - -Tipus d'ubicacions suportades: - - /paris # el nom d'una ciutat - /~Eiffel+tower # el nom de qualsevol lloc famós - /Москва # el nom Unicode de qualsevol lloc en qualsevol idioma - /muc # el codi d'un aeroport (3 lletres) - /@stackoverflow.com # el nom d'un domini web - /94107 # un codi d'àrea - /-78.46,106.79 # coordenades de GPS - -Llocs especials: - - /moon # la fase de la lluna (afegeix ,+US o ,+France per a aquests països) - /moon@2016-10-25 # la fase de la lluna en una data especfica (@2016-10-25) - -Unitats: - - ?m # mètriques (SI) (l'estàndard a tots els llocs excepte als EEUU) - ?u # Sistema Unificat de Classificació del Sòl o USCS (l'estàndard als EEUU) - ?M # mostrar la velocitat del vent en m/s - -Opcions de visualització: - - ?0 # noms el clima actual - ?1 # el clima actual + la previsió d'1 dia - ?2 # el clima actual + la previsió de 2 dies - ?n # versió curta (només el dia i la nit) - ?q # versió silenciosa (sense el text de "El temps a") - ?Q # versió supersilenciosa (ni "El temps a" ni el nom de la ciutat) - ?T # desactiva les seqüències del terminal (sense colors) - -Opcions de PNG: - - /paris.png # genera una imatge PNG - ?p # afegeix una vora al voltant de la imatge - ?t # transparència 150 - transparency=... # transparència de 0 a 255 (255 = sense transparència) - -Les opcions es poden utilitzar conjuntament: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # amb PNG les opcions s'especifiquen després del caràcter _ - /Rome_0pq_lang=it.png # una llarga seqüència d'opcions es poden separar amb el caràcter _ - -Ubicació: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Idiomes suportats: - - FULL_TRANSLATION (soportados) - PARTIAL_TRANSLATION (en progreso) - -URLs especials: - - /:help # mostra aquesta pàgina - /:bash.function # suggereix una funció wttr() en bash - /:translation # mostra informació sobre els traductors diff --git a/legacy/share/translations/ca.txt b/legacy/share/translations/ca.txt deleted file mode 100644 index d8f0c20..0000000 --- a/legacy/share/translations/ca.txt +++ /dev/null @@ -1,47 +0,0 @@ -113 : Clar : Clear -113 : Assolellat : Sunny -116 : Parcialment ennuvolat : Partly cloudy -119 : Ennuvolat : Cloudy -122 : Molt ennuvolat : Overcast -143 : Boirina : Mist -176 : Possible pluja intermitent : Patchy rain possible -179 : Possible neu intermitent : Patchy snow possible -182 : Possible aiguaneu intermitent : Patchy sleet possible -185 : Possible plugim gelat intermitent : Patchy freezing drizzle possible -200 : Possible tempesta elèctrica : Thundery outbreaks possible -227 : Tempesta de neu : Blowing snow -230 : Torb : Blizzard -248 : Boira : Fog -260 : Boira gebradora : Freezing fog -263 : Plugim suau intermitent : Patchy light drizzle -266 : Plugim suau : Light drizzle -281 : Plugim gelat : Freezing drizzle -284 : Plugim gelat intens : Heavy freezing drizzle -293 : Pluja suau intermitent : Patchy light rain -296 : Pluja suau : Light rain -299 : Pluja moderada puntual : Moderate rain at times -302 : Pluja moderada : Moderate rain -305 : Pluja forta puntual : Heavy rain at times -308 : Pluja forta : Heavy rain -311 : Calamarsa : Light freezing rain -314 : Pedra o granís : Moderate or heavy freezing rain -317 : Aiguaneu suau : Light sleet -320 : Aiguaneu moderada o forta : Moderate or heavy sleet -323 : Nevada suau intermitent : Patchy light snow -326 : Nevada suau : Light snow -329 : Nevada moderada intermitent : Patchy moderate snow -332 : Nevada moderada : Moderate snow -335 : Nevada forta intermitent : Patchy heavy snow -338 : Nevada forta : Heavy snow -350 : Gebra : Ice pellets -353 : Ruixats de pluja suau : Light rain shower -356 : Ruixats de pluja moderada o forta : Moderate or heavy rain shower -359 : Ruixats de pluja torrencial : Torrential rain shower -362 : Ruixats d'aiguaneu suau : Light sleet showers -365 : Ruixats d'aiguaneu moderada o forta : Moderate or heavy sleet showers -368 : Ruixats de neu suau : Light snow showers -371 : Nevada moderada o forta : Moderate or heavy snow showers -386 : Intervals de pluges amb trons : Patchy light rain with thunder -389 : Pluja moderada o forta amb trons : Moderate or heavy rain with thunder -392 : Nevada lleugera intermitent amb trons : Patchy light snow with thunder -395 : Nevada moderada o forta amb trons : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/cy.txt b/legacy/share/translations/cy.txt deleted file mode 100644 index ee01a19..0000000 --- a/legacy/share/translations/cy.txt +++ /dev/null @@ -1,82 +0,0 @@ -113: Glir : Clear -113: Heulog : Sunny -116: Rhannol gymylog : Partly cloudy -119: Cymylog : Cloudy -122: Cymylog : Overcast -143: Niwlog : Mist -176: Glaw anghyson yn bosib : Patchy rain possible -179: Eira anghyson yn bosib : Patchy snow possible -182: Eirlaw anghyson yn bosib : Patchy sleet possible -185: Rhewi a glaw mân anghyson yn bosib : Patchy freezing drizzle possible -200: Mellt yn bosib : Thundery outbreaks possible -227: Eira yn cael ei chwythu : Blowing snow -230: Storm eira : Blizzard -248: Niwl : Fog -260: Niwl rhewllyd : Freezing fog -263: Glaw mân ysgafn anghyson : Patchy light drizzle -266: Glaw mân ysgafn : Light drizzle -281: Glaw mân rhewllyd : Freezing drizzle -284: Glaw mân rhewllyd trwm : Heavy freezing drizzle -293: Glaw ysgafn anghyson : Patchy light rain -296: Glaw ysgafn : Light rain -299: Glaw cymedrol ar adegau : Moderate rain at times -302: Glaw cymedrol : Moderate rain -305: Glaw trwm ar adegau : Heavy rain at times -308: Glaw trwm : Heavy rain -311: Glaw rhewllyd ysgafn : Light freezing rain -314: Glaw rhewllyd trwm neu cymedrol : Moderate or heavy freezing rain -317: Eirlaw ysgafn : Light sleet -320: Eirlaw cymedrol neu trwn : Moderate or heavy sleet -323: Eira ysgafn anghyson : Patchy light snow -326: Eira ysgafn : Light snow -329: Eira cymedrol anghyson : Patchy moderate snow -332: Eira cymedrol : Moderate snow -335: Eira trwm anghyson : Patchy heavy snow -338: Eira trwm : Heavy snow -350: Pelenni iâ : Ice pellets -353: Cawod o law ysgafn : Light rain shower -356: Cawod o law cymedrol neu trwm : Moderate or heavy rain shower -359: Cawod o law trwm : Torrential rain shower -362: Cawodydd o eirlaw ysgafn : Light sleet showers -365: Cawodydd o eirlaw cymedrol new trwm: Moderate or heavy sleet showers -368: Cawodydd o eira ysgafn : Light snow showers -368: Cawod o law ac eira ysgafn, Niwl : Light Rain And Snow Shower, Mist -371: Cawodydd o eira cymedrol neu trwm : Moderate or heavy snow showers -386: Glaw ysgafn anghyson gyda mellt : Patchy light rain with thunder -389: Glaw cymedrol neu trwm gyda mellt : Moderate or heavy rain with thunder -392: Eira ysgafn anghyson gyda mellt : Patchy light snow with thunder -395: Eira cymedrol neu trwm gyda mellt : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/da-help.txt b/legacy/share/translations/da-help.txt deleted file mode 100644 index 6cb47f6..0000000 --- a/legacy/share/translations/da-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Brugsanvisning: - - $ curl wttr.in # Nuværende lokation - $ curl wttr.in/aarhus # Vejret i Aarhus - -Understøttede lokationsspecifikationer: - - /Skanderborg # Bynavn - /~Aarhus+stadion # Valgfri lokation - /Москва # Unicode-navn på lokation på alle sprog - /cph # Flyvepladskode (3 bogstaver) - /@stackoverflow.com # Domænenavn - /94107 # Postnummer (kun USA) - /-78.46,106.79 # GPS-koordinater - -Særlige lokationer: - - /moon # Månefase (brug med ,+US eller ,+France for disse lokationer) - /moon@2014-10-26 # Månefase for specifik dato (@2014-10-26) - -Enheder: - - ?m # Metrisk (SI) (standard alle steder undtagen i USA) - ?u # USCS (standard i USA) - ?M # Vindstyrke i meter per sekund - -Visningsvalg: - - ?0 # Øjebliksvejr - ?1 # Øjebliksvejr + 1 dag - ?2 # Øjebliksvejr + 2 dage - ?n # Simplificeret visning (kun dag og nat) - ?q # Begrænset visning (ingen "Vejrmelding"-tekst) - ?Q # Meget begrænset visning (ingen "Vejrmelding", ingen bynavn) - ?T # Ingen terminalsekvenser (ingen farver) - -PNG valg: - - /paris.png # Generér en PNG-fil - ?p # Tilføj ramme - ?t # Sæt gennemsigtighed til 150 - transparency=... # Tilpas gennemsigtighed fra 0 til 255 (255 = ikke gennemsigtigt) - -Kombinationsmuligheder: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # For .PNG er fil-modus specificeret efter _ - /Rome_0pq_lang=it.png # Sprog defineres efter underscore (_) - -Oversættelser: - - $ curl da.wttr.in/Aarhus - $ curl wttr.in/aarhus?lang=da - $ curl -H "Accept-Language: da" wttr.in/aarhus - -Understøttede sprog: - - FULL_TRANSLATION (understøttet) - PARTIAL_TRANSLATION (under udarbejdelse) - -Særlige URL'er: - - /:help # Vis denne side - /:bash.function # Vis den foreslåede bash-funktion wttr() - /:translation # Vis information om oversætterne diff --git a/legacy/share/translations/da.txt b/legacy/share/translations/da.txt deleted file mode 100644 index 133ce0b..0000000 --- a/legacy/share/translations/da.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Skyfrit : Clear -113: Sol : Sunny -116: Delvist skyet : Partly cloudy -119: Skyet : Cloudy -122: Overskyet : Overcast -143: Diset : Mist -176: Skiftende regn : Patchy rain possible -179: Skiftende sne : Patchy snow possible -182: Skiftende slud : Patchy sleet possible -185: Skiftende kold småregn : Patchy freezing drizzle possible -200: Fare for torden : Thundery outbreaks possible -227: Snefygning : Blowing snow -230: Snestorm : Blizzard -248: Tåge : Fog -260: Frysende tåge : Freezing fog -263: Skiftende og let støvregn : Patchy light drizzle -266: Let støvregn : Light drizzle -281: Kold støvregn : Freezing drizzle -284: Kraftig kold regn : Heavy freezing drizzle -293: Skiftende let regn : Patchy light rain -296: Let regn : Light rain -299: Skiftevist en smule regn : Moderate rain at times -302: En smule regn : Moderate rain -305: Skiftevist kraftig regn : Heavy rain at times -308: Kraftig regn : Heavy rain -311: Let og frysende regn : Light freezing rain -314: Moderat eller kraftig frysende regn : Moderate or heavy freezing rain -317: Let slud : Light sleet -320: Moderat eller kraftig slud : Moderate or heavy sleet -323: Byger af let sne : Patchy light snow -326: Let sne : Light snow -329: Byger med moderat sne : Patchy moderate snow -332: Moderat sne : Moderate snow -335: Byger med kraftig sne : Patchy heavy snow -338: Kraftig sne : Heavy snow -350: Haglbyger : Ice pellets -353: Lette regnbyger : Light rain shower -356: Moderate eller kraftige regnbyger : Moderate or heavy rain shower -359: Skybrud : Torrential rain shower -362: Lette sludbyger : Light sleet showers -365: Moderate eller kraftige sludbyger : Moderate or heavy sleet showers -368: Lette snebyger : Light snow showers -371: Moderate eller kraftige snebyger : Moderate or heavy snow showers -386: Byger af let regn med torden : Patchy light rain with thunder -389: Moderat eller krafig regn med torden : Moderate or heavy rain with thunder -392: Byger af let sne med torden : Patchy light snow with thunder -395: Moderat eller kraftig sne med torden : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/de-help.txt b/legacy/share/translations/de-help.txt deleted file mode 100644 index ea8155d..0000000 --- a/legacy/share/translations/de-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Benutzung: - - $ curl wttr.in # aktuelle Position - $ curl wttr.in/muc # Wetter, Flughafen München - -Unterstütze Ortstypen: - - /paris # Stadtname - /~Eiffel+tower # wählbarer Ort - /Москва # Unicode Name von einem Ort in irgendeiner Sprache - /muc # IATA-Flughafencode (3 Buchstaben) - /@stackoverflow.com # Domainname - /94107 # Area code (nur für USA) - /-78.46,106.79 # GPS Koordinaten - -Spezielle Orte: - - /moon # Mondphase (bei Benutzung von z.B. ,+US oder ,+France wird die Phase des jeweiligen Ortes angezeigt) - /moon@2016-10-25 # Mondphase eines Tages (@2016-10-25) - -Maßeinheiten: - - ?m # metrisch (SI) (standard überall außer bei Orten in den USA) - ?u # USCS (standard in den USA) - ?M # Windgeschwindigkeiten in m/s - -Ansichteinstellungen: - - ?0 # Zeige nur aktuelles Wetter - ?1 # Zeige aktuelles Wetter + 1 Tag - ?2 # Zeige aktuelles Wetter + 2 Tage - ?n # Kleine Version (nur Tag & Nacht) - ?q # Schmale Version (kein 'Wetter Report' Text) - ?Q # Superschmale Version (kein 'Wetter Report' Text und Ortsname) - ?T # Keine Farben - -PNG optionen: - - /paris.png # generiert eine PNG Datei - ?p # fügt einen Rahmen hinzu - ?t # Transparenz von 150 - transparency=... # Transparenz von 0 bis 255 (255 = nicht transparent) - -Optionen können kombiniert werden: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # wird eine PNG benutzt, dann werden diese Optionen nach einem _ (Unterstrich) hinzugefügt - /Rome_0pq_lang=it.png # einzelne Optionen werden mit einem _ (Unterstrich) getrennt - -Lokalisierung: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Unterstützte Sprachen: - - FULL_TRANSLATION (supported) - PARTIAL_TRANSLATION (in progress) - -Spezialseiten: - - /:help # zeigt diese Seite an - /:bash.function # zeigt empfehlenswerte bash Funktion wttr() an - /:translation # zeigt Informationen der Übersetzer an - diff --git a/legacy/share/translations/de.txt b/legacy/share/translations/de.txt deleted file mode 100644 index c272b75..0000000 --- a/legacy/share/translations/de.txt +++ /dev/null @@ -1,50 +0,0 @@ -: Regen : Rain -: leichter Regen, Regenschauer : Light Rain, Rain Shower -: Regenschauer : Rain Shower -113: Wolkenlos : Clear -113: Sonnig : Sunny -116: Leicht Bewölkt : Partly cloudy -119: Wolkig : Cloudy -122: Bedeckt : Overcast -143: Nebel : Mist -176: Stellenweise Regen möglich : Patchy rain possible -179: Stellenweise Schnee möglich : Patchy snow possible -182: Stellenweise Schneeregen möglich : Patchy sleet possible -185: Stellenweise gefrierende Nässe möglich : Patchy freezing drizzle possible -200: Gewitter möglich : Thundery outbreaks possible -227: Schneesturm : Blowing snow -230: Blizzard : Blizzard -248: Nebel : Fog -260: Gefrierender Nebel : Freezing fog -263: Stellenweise Nieselregen : Patchy light drizzle -266: Leichter Nieselregen : Light drizzle -281: Gefrierender Nieselregen : Freezing drizzle -284: Starker gefrierender Nieselregen : Heavy freezing drizzle -293: Stellenweise leichter Regen : Patchy light rain -296: Leichter Regen : Light rain -299: Stellenweise gemäßigter Regen : Moderate rain at times -302: Gemäßigter Regen : Moderate rain -305: Stellenweise starker Regen : Heavy rain at times -308: Starker Regen : Heavy rain -311: Leichter gefrierender Regen : Light freezing rain -314: Gemäßigter oder starker gefrierender Regen : Moderate or heavy freezing rain -317: Leichter Schneeregen : Light sleet -320: Gemäßigter oder starker Schneeregen : Moderate or heavy sleet -323: Stellenweise leichter Schneefall : Patchy light snow -326: Leichter Schneefall : Light snow -329: Stellenweise gemäßigter Schneefall : Patchy moderate snow -332: Gemäßigter Schneefall : Moderate snow -335: Stellenweise starker Schneefall : Patchy heavy snow -338: Starker Schneefall : Heavy snow -350: Eiskörner : Ice pellets -353: Leichter Regen : Light rain shower -356: Gemäßigter oder starker Regen : Moderate or heavy rain shower -359: Wolkenbruch : Torrential rain shower -362: Leichter Schneeregen : Light sleet showers -365: Gemäßigter oder starker Schneeregen : Moderate or heavy sleet showers -368: Leichter Schneefall : Light snow showers -371: Gemäßigter oder starker Schneefall : Moderate or heavy snow showers -386: Stellenweise leichter Regen mit Gewitter : Patchy light rain with thunder -389: Gemäßigter oder starker Regen mit Gewitter : Moderate or heavy rain with thunder -392: Stellenweise leichter Schnefall mit Gewitter : Patchy light snow with thunder -395: Gemäßigter oder starker Schnefall mit Gewitter : Moderate or heavy snow with thunder \ No newline at end of file diff --git a/legacy/share/translations/dk-help.txt b/legacy/share/translations/dk-help.txt deleted file mode 100644 index b07520d..0000000 --- a/legacy/share/translations/dk-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Brugsanvisning: - - $ curl wttr.in # nuværende lokation - $ curl wttr.in/osl # vejret på Gardermoen flyveplads - -Understøttede lokationsspecifikationer: - - /gistrup # bynavn - /~Aalborg+stadion # valgfri lokation - /Москва # Unicode navn på lokation på alle sprog - /cph # flyvepladskode (3 bogstaver) - /@stackoverflow.com # domønenavn - /94107 # postnummer (kun USA) - /-78.46,106.79 # GPS-koordinater - -Specielle lokationer: - - /moon # Månefase (brug med ,+US eller ,+France for disse lokationer) - /moon@2014-10-26 # Månefase for specifik dato (@2014-10-26) - -Enheder: - - ?m # metrisk (SI) (standard alle steder undtaget i USA) - ?u # USCS (standard i USA) - ?M # vindstyrke i meter per sekund - -Visningsvalg: - - ?0 # kun vejret nu - ?1 # vejret nu + 1 dag - ?2 # vejret nu + 2 dage - ?n # smal visning (kun dag og nat) - ?q # stille visning (ingen "Vejrmelding"-tekst) - ?Q # superstille visning (ingen "Vejrmelding", ingen bynavn) - ?T # ingen terminalsekvenser (ingen farver) - -PNG valg: - - /paris.png # generer en PNG-fil - ?p # tegn ramme på - ?t # gennemsigtighed 150 - transparency=... # gennemsigtighed fra 0 til 255 (255 = ikke gennemsigtigt) - -Tilvalg kan kombineres: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # for PNG er filmodus specificeret efter _ - /Rome_0pq_lang=it.png # lange tilvalg separeres med underscore (_) - -Oversættelser: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Understøttede sprog: - - FULL_TRANSLATION (understøttet) - PARTIAL_TRANSLATION (under udarbejdning) - -Specielle URLer: - - /:help # vis denne side - /:bash.function # vis den foreslåede bash-funktion wttr() - /:translation # vis information om oversætterne diff --git a/legacy/share/translations/el-help.txt b/legacy/share/translations/el-help.txt deleted file mode 100644 index 10ac3f9..0000000 --- a/legacy/share/translations/el-help.txt +++ /dev/null @@ -1,72 +0,0 @@ -Χρήση: - - $ curl wttr.in # καιρός τρέχουσας τοποθεσίας (κατά προσέγγιση, βάσει IP) - $ curl wttr.in/ath # ο καιρός στο Διεθνή Αερολιμένα Αθηνών «Ελ. Βενιζέλος» - -Υποστηριζόμενες μορφές τοποθεσιών: - - /paris # όνομα πόλης - /~Eiffel+tower # κάποια τοποθεσία - /Москва # Unicode όνομα οποιασδήποτε τοποθεσίας σε οποιαδήποτε γλώσσα - /ath # κωδικός αεροδρομίου (3 γράμματα) - /@stackoverflow.com # (διαδικτυακό) όνομα τομέα (domain) - /94107 # κωδικός περιοχής - /-78.46,106.79 # γεωγραφικές συντεταγμένες (GPS) - -Εξειδικευμένες τοποθεσίες: - - /moon # Φάση Σελήνης (προσθέστε ,+US ή ,+France για τις πόλεις) - /moon@2016-10-25 # Φάση Σελήνης για την ημερομηνία (@2016-10-25) - /moon@2019-06-18.png?T -omoon.png # Φάση Σελήνης για την ημερομηνία (@2019-06-18), όχι ANSI, εξοδος στο αρχείο `moon.png` - -Σύστημα μέτρησης: - - m # μετρικό (SI) (προεπιλογή για οπουδήποτε εκτός ΗΠΑ) - u # USCS (προεπιλογή για τις ΗΠΑ) - M # εμφάνιση ταχύτητας ανέμου σε m/s - -Επιλογές Προβολής: - - 0 # καιρός τρέχουσας ημέρας μόνο - 1 # καιρός τρέχουσας ημέρας + 1 ημέρα - 2 # καιρός τρέχουσας ημέρας + 2 ημέρες - A # παραβλέπει τον User-Agent και επιβάλει μορφή εξόδου ANSI (τερματικό) - F # μη εμφάνιση της γραμμής "Follow" - n # συνοπτική εκδοχή (ημέρα και νύχτα μόνο) - q # σιωπηλή εκδοχή (όχι κείμενο "Weather report") - Q # υπερσιωπηλή εκδοχή (όχι κείμενο "Weather report", όχι όνομα πόλης) - T # απενεργοποίηση ακολουθιών τερματικού (όχι χρώματα) - -Επιλογές PNG: - - /paris.png # δημιουργία PNG αρχείου - p # προσθήκη πλαισίου γύρω από τα περιέχομενα εξόδου - t # διαφάνεια 150 - transparency=nnn # διαφάνεια nnn (από 0 έως 255 - 255 = αδιαφανές) - -Οι επιλογές μπορούν να συνδυαστούν: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris?_0pq.png # η έξοδος σε PNG αρχείο ορίζεται μετά από το _ - /Rome?_0pq_lang=it.png # μακροσκελείς επιλογές διαχωριζόμενες με κάτω παύλα (underscore) - /Athens?"1pTng&lang=el" # συνδυασμένες επιλογές μπορούν να περικλείονται σε εισαγωγικά! - - -Τοπικοποίηση: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Υποστηριζόμενες γλώσσες: - - FULL_TRANSLATION (πλήρως υποστηριζόμενες) - PARTIAL_TRANSLATION (εργασία σε εξέλιξη) - -Ειδικά URLs: - - /:help # εμφάνιση της παρούσας βοήθειας - /:bash.function # εμφάνιση συνιστώμενων bash λειτουργιών wttr() - /:translation # εμφάνιση πληροφοριών για τους μεταφραστές - diff --git a/legacy/share/translations/el.txt b/legacy/share/translations/el.txt deleted file mode 100644 index 3a4be71..0000000 --- a/legacy/share/translations/el.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Καθαρός : Clear -113: Λιακάδα : Sunny -116: Αραιή συννεφιά : Partly cloudy -119: Συννεφιά : Cloudy -122: Πυκνή νέφωση : Overcast -143: Αραιή ομίχλη : Mist -176: Πιθανή βροχή τοπικά : Patchy rain possible -179: Πιθανή χιονόπτωση τοπικά : Patchy snow possible -182: Πιθανή χαλαζόπτωση τοπικά : Patchy sleet possible -185: Πιθανό παγωμ. ψιλόβροχο τοπικά : Patchy freezing drizzle possible -200: Πιθανή πτώση κεραυνών : Thundery outbreaks possible -227: Ριπές χιονιού : Blowing snow -230: Χιονοθύελλα : Blizzard -248: Ομίχλη : Fog -260: Παγωμένη ομίχλη : Freezing fog -263: Ασθενής ψιχάλα τοπικά : Patchy light drizzle -266: Ασθενής ψιχάλα : Light drizzle -281: Παγωμένο ψιλόβροχο : Freezing drizzle -284: Πυκνό παγωμένο ψιλόβροχο : Heavy freezing drizzle -293: Ασθενής όμβρος τοπικά : Patchy light rain -296: Ασθενής βροχόπτωση : Light rain -299: Μέτρια βροχή παροδικά : Moderate rain at times -302: Μέτρια βροχόπτωση : Moderate rain -305: Έντονη βροχή παροδικά : Heavy rain at times -308: Έντονη βροχόπτωση : Heavy rain -311: Αραιό χιονόνερο : Light freezing rain -314: Μέτριο ή έντονο χιονόνερο : Moderate or heavy freezing rain -317: Ασθενής χαλαζόπτωση : Light sleet -320: Μέτρια ή έντονη χαλαζόπτωση : Moderate or heavy sleet -323: Αραιή χιονόπτωση κατά τόπους : Patchy light snow -326: Αραιή χιονόπτωση : Light snow -329: Μέτρια χιονόπτωση τοπικά : Patchy moderate snow -332: Μέτρια χιονόπτωση : Moderate snow -335: Πυκνή χιονόπτωση τοπικά : Patchy heavy snow -338: Πυκνή χιονόπτωση : Heavy snow -350: Χιονόνερο : Ice pellets -353: Ασθενής βροχή παροδικά : Light rain shower -356: Μέτρια ή έντονη βροχή παροδικά : Moderate or heavy rain shower -359: Καταρρακτώδης βροχή παροδικά : Torrential rain shower -362: Ασθενής χαλαζόπτωση παροδικά : Light sleet showers -365: Μέτρια/έντονη χαλαζόπτωση παροδικά : Moderate or heavy sleet showers -368: Αραιή χιονόπτωση παροδικά : Light snow showers -371: Μέτρια ή πυκνή χιονόπτωση παροδικά : Moderate or heavy snow showers -386: Ασθενής βροχή με κεραυνούς τοπικά : Patchy light rain with thunder -389: Μέτρια ή δυνατή βροχή με κεραυνούς : Moderate or heavy rain with thunder -392: Ασθενής χιονόπτωση-κεραυνοί τοπικά : Patchy light snow with thunder -395: Μέτρια ή πυκνή χιονόπτωση-κεραυνοί : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/en.txt b/legacy/share/translations/en.txt deleted file mode 100644 index e14b7ea..0000000 --- a/legacy/share/translations/en.txt +++ /dev/null @@ -1,81 +0,0 @@ -113: : Clear -113: : Sunny -116: : Partly cloudy -119: : Cloudy -122: : Overcast -143: : Mist -176: : Patchy rain possible -179: : Patchy snow possible -182: : Patchy sleet possible -185: : Patchy freezing drizzle possible -200: : Thundery outbreaks possible -227: : Blowing snow -230: : Blizzard -248: : Fog -260: : Freezing fog -263: : Patchy light drizzle -266: : Light drizzle -281: : Freezing drizzle -284: : Heavy freezing drizzle -293: : Patchy light rain -296: : Light rain -299: : Moderate rain at times -302: : Moderate rain -305: : Heavy rain at times -308: : Heavy rain -311: : Light freezing rain -314: : Moderate or heavy freezing rain -317: : Light sleet -320: : Moderate or heavy sleet -323: : Patchy light snow -326: : Light snow -329: : Patchy moderate snow -332: : Moderate snow -335: : Patchy heavy snow -338: : Heavy snow -350: : Ice pellets -353: : Light rain shower -356: : Moderate or heavy rain shower -359: : Torrential rain shower -362: : Light sleet showers -365: : Moderate or heavy sleet showers -368: : Light snow showers -371: : Moderate or heavy snow showers -386: : Patchy light rain with thunder -389: : Moderate or heavy rain with thunder -392: : Patchy light snow with thunder -395: : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/eo.txt b/legacy/share/translations/eo.txt deleted file mode 100644 index de1f8f2..0000000 --- a/legacy/share/translations/eo.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Klara : Clear -113: Suna : Sunny -116: Parte nuba : Partly cloudy -119: Nuba : Cloudy -122: Sensuna : Overcast -143: Nebulo : Mist -176: Flikeca pluvo ebla : Patchy rain possible -179: Flikeca neĝo ebla : Patchy snow possible -182: Flikeca hajlneĝo ebla : Patchy sleet possible -185: Flikeca frosta drizelo ebla : Patchy freezing drizzle possible -200: Tondro ebla : Thundery outbreaks possible -227: Blova neĝo : Blowing snow -230: Blizardo : Blizzard -248: Nebulo : Fog -260: Frosta nebulo : Freezing fog -263: Flikeca malforta drizelo : Patchy light drizzle -266: Malforta drizelo : Light drizzle -281: Frosta drizelo : Freezing drizzle -284: Forta frosta drizelo : Heavy freezing drizzle -293: Flikeca forta pluvo : Patchy light rain -296: Malforta pluvo : Light rain -299: Modera pluvo foje : Moderate rain at times -302: Modera pluvo : Moderate rain -305: Forta pluvvo foje : Heavy rain at times -308: Forta pluvo : Heavy rain -311: Malforta glacipluvo : Light freezing rain -314: Modera aŭ forta glacipluvo : Moderate or heavy freezing rain -317: Malforta grajlo : Light sleet -320: Modera aŭ forta hajlneĝo : Moderate or heavy sleet -323: Flikeca malforta neĝo : Patchy light snow -326: Malforta neĝo : Light snow -329: Flikeca modera neĝo : Patchy moderate snow -332: Modera neĝo : Moderate snow -335: Flikeca forta neĝo : Patchy heavy snow -338: Forta neĝo : Heavy snow -350: Grajlo : Ice pellets -353: Malforta pluvoverŝo : Light rain shower -356: Modera pluvoverŝo : Moderate or heavy rain shower -359: Torrenta pluvoverŝo : Torrential rain shower -362: Malforta glacipluvego : Light sleet showers -365: Modera aŭ forta glacipluvego : Moderate or heavy sleet showers -368: Malforta hajlneĝo : Light snow showers -371: Modera aŭ forta neĝipluvego : Moderate or heavy snow showers -386: Flikeca malforta pluvo kun tondro : Patchy light rain with thunder -389: Modera aŭ forta pluvo kun tondro : Moderate or heavy rain with thunder -392: Flikeca malforta neĝo kun tondro : Patchy light snow with thunder -395: Modera aŭ forta neĝo kun tondro : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/es-help.txt b/legacy/share/translations/es-help.txt deleted file mode 100644 index 07f2c34..0000000 --- a/legacy/share/translations/es-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Instrucciones: - - $ curl wttr.in # el clima en su ubicación actual - $ curl wttr.in/muc # el clima en el aeropuerto de Múnich - -Tipos de ubicación soportados: - - /paris # el nombre de una ciudad - /~Eiffel+tower # el nombre de cualquier sitio famoso - /Москва # el nombre Unicode de cualquier sitio en cualquier idioma - /muc # el código de un aeropuerto (3 letras) - /@stackoverflow.com # el nombre de un dominio web - /94107 # un código de area - /-78.46,106.79 # coordenadas de GPS - -Sitios especiales: - - /moon # la fase de la luna (añade ,+US o ,+France para estos paises) - /moon@2016-10-25 # la fase de la luna en una fecha específica (@2016-10-25) - -Unidades: - - ?m # métricas (SI) (el estándar en todos los sitios excepto en EEUU) - ?u # Sistema Unificado de Clasificación del Suelo o USCS (el estándar en EEUU) - ?M # mostrar la velocidad del viento en m/s - -Opciones de visualización: - - ?0 # solamente el clima actual - ?1 # el clima actual + la previsión de 1 día - ?2 # el clima actual + la previsión de 2 días - ?n # versión corta (solo el día y la noche) - ?q # versión silenciosa (sin el texto de "El tiempo en") - ?Q # versión supersilenciosa (ni "El tiempo en" ni el nombre de la ciudad) - ?T # desactiva las secuencias de terminal (sin colores) - -Opciones de PNG: - - /paris.png # genera una imagen PNG - ?p # añade un borde alrededor de la imagen - ?t # transparencia 150 - transparency=... # transparencia de 0 a 255 (255 = sin transparencia) - -Las opciones se pueden utilizar conjuntamente: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # en PNG las opciones se especifican después del carácter _ - /Rome_0pq_lang=it.png # una larga secuencia de opciones se puede separar por el carácter _ - -Ubicación: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Idiomas soportados: - - FULL_TRANSLATION (soportados) - PARTIAL_TRANSLATION (en progreso) - -URLs especiales: - - /:help # muestra esta página - /:bash.function # sugiere una función wttr() en bash - /:translation # muestra información acerca de los traductores diff --git a/legacy/share/translations/es.txt b/legacy/share/translations/es.txt deleted file mode 100644 index 177fe1f..0000000 --- a/legacy/share/translations/es.txt +++ /dev/null @@ -1,47 +0,0 @@ -114: Claro: Clear -113: Soleado: Sunny -116: Parcialmente nublado: Partly cloudy -119: Nublado: Cloudy -122: Cubierto de nubes: Overcast -143: Bruma: Mist -176: Posible lluvia irregular: Patchy rain possible -179: Posible aguanieve irregular: Patchy snow possible -182: Posible aguanieve irregular: Patchy sleet possible -185: Posible llovizna helada irregular: Patchy freezing drizzle possible -200: Posibles brotes de tormentas: Thundery outbreaks possible -227: Nieve tormentosa: Blowing snow -230: Tormenta de nieve: Blizzard -248: Niebla: Fog -260: Niebla helada: Freezing fog -263: Llovizna ligera irregular: Patchy light drizzle -266: Llovizna ligera: Light drizzle -281: Llovizna helada: Freezing drizzle -284: Llovizna fuertemente helada: Heavy freezing drizzle -293: Lluvia ligera irregular: Patchy light rain -296: Lluvia ligera: Light rain -299: Lluvia moderada ocasional: Moderate rain at times -302: Lluvia moderada: Moderate rain -305: LLuvia fuerte ocasional: Heavy rain at times -308: Lluvia fuerte: Heavy rain -311: Lluvia ligera helada: Light freezing rain -314: Lluvia helada moderada o fuerte: Moderate or heavy freezing rain -317: Aguanieve ligero: Light sleet -320: Aguanieve moderado o fuerte: Moderate or heavy sleet -323: Nieve ligera irregular: Patchy light snow -326: Nieve ligera: Light snow -329: Nieve moderada irregular: Patchy moderate snow -332: Nieve moderada: Moderate snow -335: Nieve pesada irregular: Patchy heavy snow -338: Nieve pesada: Heavy snow -350: Gránulos de hielo: Ice pellets -353: Aguacero ligero: Light rain shower -356: Aguacero moderada o fuerte: Moderate or heavy rain shower -359: Aguacero torrencial: Torrential rain shower -362: Aguacero ligero con aguanieve: Light sleet showers -365: Aguacero con aguanieve moderado o fuerte: Moderate or heavy sleet showers -368: Aguacero con nieve ligero: Light snow showers -371: Aguacero con nieve moderado o fuerte: Moderate or heavy snow showers -386: Lluvia ligera irregular con truenos: Patchy light rain with thunder -389: Lluvia moderada o fuerte con truenos: Moderate or heavy rain with thunder -392: Nieve ligera irregular con truenos: Patchy light snow with thunder -395: Nieve moderada o fuerte con truenos: Moderate or heavy snow with thunder diff --git a/legacy/share/translations/et-help.txt b/legacy/share/translations/et-help.txt deleted file mode 100644 index 69bc90c..0000000 --- a/legacy/share/translations/et-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Kasutus: - - $ curl wttr.in # praegune asukoht - $ curl wttr.in/tll # ilmaprognoos Tallinna Lennujaamas - -Toetatud asukohatüübid: - - /paris # linna nimi - /~suur+munamägi # mistahes asukoht - /Москва # Ükskõik millises keeles Unicode'i vormingus asukoha nimi - /muc # IATA Lennujaama kood (3 tähemärki) - /@stackoverflow.com # domeeninimi - /94107 # Piirkonna kood (Ainult USA) - /-78.46,106.79 # GPS-koordinaadid - -Erilised asukohad: - - /moon # Kuu faas (lisage, +US või +France linnade jaoks)) - /moon@2016-10-25 # Kuu faas kindlal kuupäeval (@2016-10-25) - -Ühikud: - - ?m # meetriline (SI) (kasutatakse vaikimisi kõikjal peale USA) - ?u # USCS (kasutusel vaikimisi USA) - ?M # kuva tuule kiirust m/s - -Vaadete valikuid: - - ?0 # kuva ainult praegune ilm - ?1 # kuva praegune ilm + 1 päeva prognoos - ?2 # kuva praegune ilm + 2 päeva prognoos - ?n # kitsas vaade (Päeva & Öö prognoos) - ?q # taltsas variant ('ilmaprognoos' tekstita) - ?Q # eriti taltsas variant (asukohata ja 'ilmaprognoos' tekstita) - ?T # värvideta - -PNG valikud: - - /paris.png # loo PNG fail - ?p # lisab raami ümber väljundi - ?t # läbipaistvus 150 - transparency=... # läbipaistvus 0-st kuni 255-ni (255 = pole läbipaistev) - -Valikuid saab kombineerida: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # PNG failis saab valikuid määrata peale _ (alakriips) tähemärki - /Rome_0pq_lang=it.png # pikad valikud on eraldatud alakriipsuga - -Lokaliseerimine: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Toetattud keeled: - - FULL_TRANSLATION (toetatud) - PARTIAL_TRANSLATION (teoksil) - -Erilehed: - - /:help # kuvab käesolevat lehte - /:bash.function # kuvab soovitatud bash-funktsiooni wttr() - /:translation # kuvab infot tõlkijate kohta diff --git a/legacy/share/translations/et.txt b/legacy/share/translations/et.txt deleted file mode 100644 index 17b746b..0000000 --- a/legacy/share/translations/et.txt +++ /dev/null @@ -1,55 +0,0 @@ -113: Selge : Clear -113: Päikeseline : Sunny -116: Vahelduv pilvisus : Partly cloudy -119: Pilvine : Cloudy -122: Sombune : Overcast -143: Uduvine : Mist -176: Paiguti vihmasaju võimalus : Patchy rain possible -179: Paiguti lumesaju võimalus : Patchy snow possible -182: Paiguti lörtsisaju võimalus : Patchy sleet possible -185: Paiguti jääudu võimalus : Patchy freezing drizzle possible -200: Äikese võimalus : Thundery outbreaks possible -227: Tuisk : Blowing snow -230: Lumetorm : Blizzard -248: Udu : Fog -260: Jääudu : Freezing fog -263: Paiguti nõrk uduvihm : Patchy light drizzle -266: Nõrk uduvihm : Light drizzle -281: Jääudu : Freezing drizzle -284: Tugev uduvihm : Heavy freezing drizzle -293: Vahelduv nõrk vihm : Patchy light rain -296: Nõrk vihm : Light rain -299: Vahelduv mõõdukas vihm : Moderate rain at times -302: Mõõdukas vihm : Moderate rain -305: Vahelduv tugev vihm : Heavy rain at times -308: Tugev vihm : Heavy rain -311: Nõrk jäävihm : Light freezing rain -314: Mõõdukas või tugev jäävihm : Moderate or heavy freezing rain -317: Nõrk lörtsisadu : Light sleet -320: Mõõdukas või tugev lörtsisadu : Moderate or heavy sleet -323: Paiguti nõrk lumesadu : Patchy light snow -326: Nõrk lumesadu : Light snow -329: Paiguti mõõdukas lumesadu : Patchy moderate snow -332: Mõõdukas lumesadu : Moderate snow -335: Paiguti tugev lumesadu : Patchy heavy snow -338: Tugev lumesadu : Heavy snow -350: Rahe : Ice pellets -353: Nõrk hoogvihm : Light rain shower -356: Mõõdukas või tugev hoogvihm : Moderate or heavy rain shower -359: Padu hoogvihm : Torrential rain shower -362: Nõrk hooglörts : Light sleet showers -365: Mõõdukas või tugev hooglörts : Moderate or heavy sleet showers -368: Nõrk hooglumi : Light snow showers -371: Mõõdukas või tugev hooglumi : Moderate or heavy snow showers -386: Paiguti nõrk vihm äikesega : Patchy light rain with thunder -389: Mõõdukas või tugev vihm äikesega : Moderate or heavy rain with thunder -392: Paiguti nõrk lumesadu äikesega : Patchy light snow with thunder -395: Mõõdukas või tugev lumesadu äikesega : Moderate or heavy snow with thunder - : Hoogvihm : Rain shower - : Tugev hoogvihm : Heavy showers - : Nõrk hoogvihm : Light showers - : Tugev hooglumi : Heavy snow showers - : Äikesevihm : Thundery showers - : Tugev äikesevihm : Thundery heavy rain - : Äikesega lumesadu : Thundery snow showers - : Tugev hooglumi : Heavy snow showers diff --git a/legacy/share/translations/eu-help.txt b/legacy/share/translations/eu-help.txt deleted file mode 100644 index 942f32b..0000000 --- a/legacy/share/translations/eu-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Argibideak: - - $ curl wttr.in # eguraldia zure kokapenean - $ curl wttr.in/bio # eguraldia Bilboko aireportuan - -Onartzen diren kokapen motak: - - /bilbao # hiri baten izena - /~Bilbao+Guggenheim+museum # leku famatu baten izena - /Москва # Edozein lekuko edozein hizkuntzako Unicode izena - /bio # aeroportu baten kodea (3 letra) - /@stackoverflow.com # web domeinu baten izena - /94107 # area kode bat - /-78.46,106.79 # GPS koordenadak - -Leku bereziak: - - /moon # ilargiaran aldia (gehitu ,+US o ,+France herrialde hauetarako) - /moon@2016-10-25 # ilargiaren aldia data konkretu batean (@2016-10-25) - -Unitateak: - - ?m # metrikak (SI) (leku guztietako estandarra, AEB ezik) - ?u # Lurra sailkatzeko sistema batua edo LSSB (AEB estandarra) - ?M # haizeko abiadura erakutsi (m/s) - -Bistaratzeko aukerak: - - ?0 # oraingo eguraldia bakarrik - ?1 # oraingo eguraldia + egun bateko iragarpena - ?2 # oraingo eguraldia + bi egunerako iragarpena - ?n # bertsio laburra (eguna eta gaua bakarrik) - ?q # bertsio isila ("Eguraldia..." textua barik) - ?Q # bertsio super isila ("Eguraldia ..." eta hiriaren izenik ez) - ?T # terminalaren sekuentziak desaktibatu (kolorerik ez) - -PNG aukerak: - - /paris.png # irudi PNG bat sortzen du - ?p # irudiaren inguruan ertz bat gehitzen du - ?t # 150 gardentasuna - transparency=... # 0tik 255era gardentasuna (255 = gardentasunik ez) - -Elkarrekin erabili daiteken aukerak: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # PNG-an aukerak _ karakteren ondoren zehazten dira - /Rome_0pq_lang=it.png # aukera sekuentzia luze bat _ karakterearekin bereiz daiteke - -Kokapena: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Onartzen diren hizkuntzak: - - FULL_TRANSLATION (onartuak) - PARTIAL_TRANSLATION (abian) - -URL bereziak: - - /:help # orrialde hau erakutsi - /:bash.function # wttr() funtzio bat bash-en iradokitzen du - /:translation # itzultzaileei buruzko informazioa erakusten du diff --git a/legacy/share/translations/eu.txt b/legacy/share/translations/eu.txt deleted file mode 100644 index efef339..0000000 --- a/legacy/share/translations/eu.txt +++ /dev/null @@ -1,47 +0,0 @@ -114: Oskarbia: Clear -113: Eguzkitsu: Sunny -116: Neurri batean hodeitsu: Partly cloudy -119: Hodeitsu: Cloudy -122: Iluna: Overcast -143: Lanbroa: Mist -176: Posible euri irregularra: Patchy rain possible -179: Posible elurbusti irregularra: Patchy snow possible -182: Posible elurbusti irregularra: Patchy sleet possible -185: Posible zirimiri hotz irregularra: Patchy freezing drizzle possible -200: Posible ekaitz agerraldi: Thundery outbreaks possible -227: Elur-ekaitza: Blowing snow -230: Elur-ekaitza: Blizzard -248: Lainoa: Fog -260: Laino hotza: Freezing fog -263: Garo irregularra: Patchy light drizzle -266: Garoa: Light drizzle -281: Garo hotza: Freezing drizzle -284: Zirimiri hotz-hotza: Heavy freezing drizzle -293: Zirimiri irregularra: Patchy light rain -296: Zirimiri: Light rain -299: Noizbehinkako euri ertaina: Moderate rain at times -302: Euri ertaina: Moderate rain -305: Noizbehinkako euri-zaparrada: Heavy rain at times -308: Euri-zaparrada: Heavy rain -311: Zirimiri hotza: Light freezing rain -314: Euri ertain edo zaparrada hotza: Moderate or heavy freezing rain -317: Elurbusti arina: Light sleet -320: Elurbusti ertain edo gogorra: Moderate or heavy sleet -323: Gazura irregularra: Patchy light snow -326: Gazura: Light snow -329: Noizbehinkako elur ertaina: Patchy moderate snow -332: Elur ertaina: Moderate snow -335: Nieve pesada irregular: Patchy heavy snow -338: Nieve pesada: Heavy snow -350: Txingorra: Ice pellets -353: Zaparrada arina: Light rain shower -356: Zaparrada ertain edo gogorra: Moderate or heavy rain shower -359: Uholde-zaparrada: Torrential rain shower -362: Elurbusti zaparrada arina: Light sleet showers -365: Elurbusti zaparrada ertaina edo gogorra: Moderate or heavy sleet showers -368: Elur zaparrada arina: Light snow showers -371: Elur zaparrada ertaina edo gogorra: Moderate or heavy snow showers -386: Zirimiri irregularra trumoiekin: Patchy light rain with thunder -389: Euri ertaina edo gogorra trumoiekin: Moderate or heavy rain with thunder -392: Elur arina irregularra trumoiekin: Patchy light snow with thunder -395: Elur ertaina edo gogorra trumoiekin: Moderate or heavy snow with thunder diff --git a/legacy/share/translations/fa-help.txt b/legacy/share/translations/fa-help.txt deleted file mode 100644 index ef01cc3..0000000 --- a/legacy/share/translations/fa-help.txt +++ /dev/null @@ -1,67 +0,0 @@ - :نحوه استفاده - - $ curl wttr.in # موقعیت فعلی - $ curl wttr.in/muc # وضعیت اب و هوا در فرودگاه مونیخ - - :انواع مکان های پشتیبانی شده - - /paris # نام شهر - /~Eiffel+tower # هر مکانی - /Москва # نام یونیکد هر مکانی در هر زبانی - /muc # کد فرودگاه (3 حرفی) - /@stackoverflow.com # نام دامنه - /94107 # کد منطقه - /-78.46,106.79 # موقعیت جغرافیایی - - :مکان های خاص - - /moon # فازهای ماه (+US یا +France را برای این شهرها اضافه کنید) - /moon@2016-10-25 # فازهای ماه برای تاریخ خاص (@2016-10-25) - - :واحدها - - ?m # متریک (سیستم SI) (به طور پیشفرض در همه جا به جز امریکا استفاده می شود.) - ?u # USCS (به طور پیشفرض در امریکا استفاده می شود) - ?M # نمایش سرعت باد بر حسب متر بر ثانیه - - :تنظیمات نمایش - - ?0 # فقط اب و هوای امروز - ?1 # اب و هوای امروز + 1 روز - ?2 # اب و هوای امروز + 2 روز - ?n # نسخه باریک (فقط روز و شب) - ?q # نسخه ساکت (بدون نوشته "گزارش اب و هوا") - ?Q # نسخه خیلی ساکت (بدون نوشته "گزارش اب و هوا" و اسم شهر) - ?T # حالت بدون رنگ - - :تنظیمات خروجی PNG - - /paris.png # ساختن فایل PNG - ?p # اضافه کردن حاشیه در خروجی - ?t # قرار دادن شفافیت روی 150 - transparency=... # شفافیت از 0 تا 255 (255 یعنی بدون شفافیت) - - :تنظیمات ترکیبی - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # در PNG حالت فایل بعد از _ ذکر می شود - /Rome_0pq_lang=it.png # تنظیمات بلند توسط اندرلاین جدا می شوند - - :محلی سازی - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - - :زبان های پشتیبانی شده - - FULL_TRANSLATION (پشتیبانی شده) - PARTIAL_TRANSLATION (در حال پیشرفت) - - :ادرس های خاص - - /:help # نمایش این صفحه - /:bash.function # نمایش تابع پیشنهادی بش برای wttr() - /:translation # نمایش اطلاعات در مورد مترجمین - diff --git a/legacy/share/translations/fa.txt b/legacy/share/translations/fa.txt deleted file mode 100644 index db29c3b..0000000 --- a/legacy/share/translations/fa.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: صاف : Clear -113: آفتابی : Sunny -116: نیمه ابری : Partly cloudy -119: ابری : Cloudy -122: پوشیده از ابر : Overcast -143: شبنم : Mist -176: احتمال بارش پراکنده باران : Patchy rain possible -179: احتمال بارش پراکنده برف : Patchy snow possible -182: احتمال بارش پراکنده تگرگ : Patchy sleet possible -185: احتمال بارش پراکنده قطرات منجمد باران : Patchy freezing drizzle possible -200: احتمال رعد و برق : Thundery outbreaks possible -227: بارش سنگین برف : Blowing snow -230: کولاک : Blizzard -248: مه : Fog -260: مه یخ زده : Freezing fog -263: بارش پراکنده نم نم باران : Patchy light drizzle -266: بارش نم نم باران : Light drizzle -281: بارش ریزباران یخ بسته : Freezing drizzle -284: بارش سنگین ریزباران یخ بسته : Heavy freezing drizzle -293: بارش پراکنده باران : Patchy light rain -296: بارش باران : Light rain -299: بارش یکنواخت و ملایم باران : Moderate rain at times -302: بارش ملایم باران : Moderate rain -305: بارش سنگین باران به صورت یکنواخت : Heavy rain at times -308: بارش سنگین باران : Heavy rain -311: بارش نم نم باران یخ بسته : Light freezing rain -314: بارش ملایم یا سنگین باران یخ بسته : Moderate or heavy freezing rain -317: بارش سبک تگرگ : Light sleet -320: بارش ملایم یا سنگین تگرگ : Moderate or heavy sleet -323: بارش پراکنده و سبک برف : Patchy light snow -326: بارش سبک برف : Light snow -329: بارش پراکنده و ملایم برف : Patchy moderate snow -332: بارش ملایم برف : Moderate snow -335: بارش پراکنده و سنگین برف : Patchy heavy snow -338: بارش سنگین برف : Heavy snow -350: بارش دانه های ریز یخ : Ice pellets -353: دوش باران سبک : Light rain shower -356: دوش باران ملایم یا سنگین : Moderate or heavy rain shower -359: دوش باران سیلی : Torrential rain shower -362: بارش سبک دوش تگرگ : Light sleet showers -365: بارش ملایم یا سنگین دوش تگرگ : Moderate or heavy sleet showers -368: بارش سبک دوش برف : Light snow showers -371: بارش ملایم یا سنگین دوش برف : Moderate or heavy snow showers -386: بارش پراکنده باران همراه با رعد و برق : Patchy light rain with thunder -389: بارش ملایم یا سنگین باران همراه با رعد و برق : Moderate or heavy rain with thunder -392: بارش پراکنده برف ملایم یا سنگین همراه با رعد و برق : Patchy light snow with thunder -395: بارش ملایم یا سنگین برف همراه با رعد و برق : Moderate or heavy snow with thunder \ No newline at end of file diff --git a/legacy/share/translations/fr-help.txt b/legacy/share/translations/fr-help.txt deleted file mode 100644 index 2da8fed..0000000 --- a/legacy/share/translations/fr-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Usage: - - $ curl wttr.in # emplacement actuel - $ curl wttr.in/cdg # météo à l'aéroport de Paris - Charles de Gaulle - -Types d'emplacements acceptés: - - /paris # nom de la ville - /~Eiffel+tower # emplacement quelconque - /Москва # nom Unicode ou emplacement quelconque dans n'importe quelle langue - /muc # code aéroport (3 lettres) - /@stackoverflow.com # nom de domaine - /94107 # code postal (seulement aux États-Unis) - /-78.46,106.79 # coordonnées GPS - -Emplacements particuliers: - - /moon # phases de la lune (ajouter ,+US ou ,+France pour accéder aux villes du même nom) - /moon@2016-10-25 # phases de la lune pour cette date (@2016-10-25) - -Unités: - - ?m # système métrique (par défaut partout sauf pour les États-Unis d'Amérique) - ?u # USCS (par défaut pour les États-Unis d'Amérique) - ?M # affiche la vitesse du vent en m/s - -Option d'affichage: - - ?0 # aujourd'hui seulement - ?1 # aujourd'hui + demain - ?2 # aujourd'hui + 2 jours - ?n # version courte (seulement le jour et la nuit) - ?q # version silencieuse (pas d'en-tête "Prévisions météo pour") - ?Q # version super-silencieuse (pas d'en-tête "Prévisions météo pour", pas de nom de la ville) - ?T # séquences d'échappement pour terminaux désactivées (pas de couleurs) - -Options PNG: - - /paris.png # génère un fichier PNG - ?p # ajoute un cadre autour de la sortie - ?t # transparency 150 (transparence 150) - transparency=... # transparence de 0 à 255 (255 = pas de transparence) - -Combiner les options: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # dans le mode PNG les options sont spécifiées après _ - /Rome_0pq_lang=it.png # les options longues sont séparées par des underscores _ - -Localisation: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Langues supportées: - - FULL_TRANSLATION (Support complet) - PARTIAL_TRANSLATION (Support incomplet) - -URLs particulières: - - /:help # affiche cette page - /:bash.function # fonction bash recommandée wttr() - /:translation # affiche les informations sur la traduction de wttr.in - diff --git a/legacy/share/translations/fr.txt b/legacy/share/translations/fr.txt deleted file mode 100644 index 87614e0..0000000 --- a/legacy/share/translations/fr.txt +++ /dev/null @@ -1,50 +0,0 @@ -: Pluie : Rain -: Pluie légère, Averses : Light Rain, Rain Shower -: Averses : Rain Shower -113 : Temps clair : Clear -113 : Ensoleillé : Sunny -116 : Partiellement couvert : Partly cloudy -119 : Nuageux : Cloudy -122 : Couvert : Overcast -143 : Brumeux : Mist -176 : Pluies éparses possibles : Patchy rain possible -179 : Chutes de neige éparses possibles : Patchy snow possible -182 : Chutes éparses de neige fondue possibles : Patchy sleet possible -185 : Bruines givrantes éparses possibles : Patchy freezing drizzle possible -200 : Orages possibles : Thundery outbreaks possible -227 : Poudrerie : Blowing snow -230 : Blizzard : Blizzard -248 : Brouillard : Fog -260 : Brouillard givrant : Freezing fog -263 : Bruines éparses et légères : Patchy light drizzle -266 : Bruine légère : Light drizzle -281 : Bruine givrante : Freezing drizzle -284 : Forte bruine givrante : Heavy freezing drizzle -293 : Pluies éparses et légères : Patchy light rain -296 : Pluie légère : Light rain -299 : Pluie modérée intermittente : Moderate rain at times -302 : Pluie modérée : Moderate rain -305 : Forte pluie intermittente : Heavy rain at times -308 : Forte pluie : Heavy rain -311 : Pluie verglaçante légère : Light freezing rain -314 : Pluie verglaçante modérée à forte : Moderate or heavy freezing rain -317 : Chutes légères de neige fondue : Light sleet -320 : Chutes de neige fondue modérées à fortes : Moderate or heavy sleet -323 : Chutes de neige éparses et légères : Patchy light snow -326 : Chutes de neige légères : Light snow -329 : Chutes de neige éparses et modérées : Patchy moderate snow -332 : Chutes de neige modérées : Moderate snow -335 : Fortes chutes de neige éparses : Patchy heavy snow -338 : Fortes chutes de neige : Heavy snow -350 : Grésil : Ice pellets -353 : Averses légères : Light rain shower -356 : Averses modérées à fortes : Moderate or heavy rain shower -359 : Averses torrentielles : Torrential rain shower -362 : Averses légères de neige fondue : Light sleet showers -365 : Averses de neige fondue modérées à fortes : Moderate or heavy sleet showers -368 : Averses de neige légères : Light snow showers -371 : Averses de neige modérées à fortes : Moderate or heavy snow showers -386 : Pluies orageuses légères et éparses : Patchy light rain with thunder -389 : Pluies orageuses modérées à fortes : Moderate or heavy rain with thunder -392 : Chutes de neige orageuses légères et éparses : Patchy light snow with thunder -395 : Chutes de neige orageuses modérées à fortes : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/fy.txt b/legacy/share/translations/fy.txt deleted file mode 100644 index 49875c8..0000000 --- a/legacy/share/translations/fy.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Helder : Clear -113: Sinnich : Sunny -116: Bytsje bewolkt : Partly cloudy -119: Bewolkt : Cloudy -122: Bewolkt : Overcast -143: Mistich : Mist -176: Misskien lokaal reinbui : Patchy rain possible -179: Misskien lokaal snie : Patchy snow possible -182: Misskien lokaal hagel : Patchy sleet possible -185: Misskien lokaal izel : Patchy freezing drizzle possible -200: Misskien in onwaarsbui : Thundery outbreaks possible -227: Snie wyn : Blowing snow -230: Sniestoarm : Blizzard -248: Mistich : Fog -260: Rijp : Freezing fog -263: Lokaal motrein : Patchy light drizzle -266: Motrein : Light drizzle -281: Izel : Freezing drizzle -284: Swiere izel : Heavy freezing drizzle -293: Lokaal in bytsje rein : Patchy light rain -296: Bytsje rein : Light rain -299: Út en troch rein : Moderate rain at times -302: Rein : Moderate rain -305: Út en troch swiere rein : Heavy rain at times -308: Swiere rein : Heavy rain -311: Lichte izel : Light freezing rain -314: Swiere izel : Moderate or heavy freezing rain -317: Lichte hagel : Light sleet -320: Swiere hagel : Moderate or heavy sleet -323: Lokaal lichte snie : Patchy light snow -326: Lichte snie : Light snow -329: Lokaal snie : Patchy moderate snow -332: Snie : Moderate snow -335: Lokaal swiere snie : Patchy heavy snow -338: Swiere snie : Heavy snow -350: Hagel : Ice pellets -353: Lichte reinbuien : Light rain shower -356: Reinbuien : Moderate or heavy rain shower -359: Ekstreem swiere reinbuien : Torrential rain shower -362: Lichte hagelbuien : Light sleet showers -365: Hagelbuien : Moderate or heavy sleet showers -368: Lichte sniebuien : Light snow showers -371: Sniebuien : Moderate or heavy snow showers -386: Lokaal lichte rein mei onwaar: Patchy light rain with thunder weer -389: Rein mei onwaar : Moderate or heavy rain with thunder -392: Lokaal lichte snie mei onwaar: Patchy light snow with thunder nweer -395: Snie mei onwaar : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/ga.txt b/legacy/share/translations/ga.txt deleted file mode 100644 index dc527a2..0000000 --- a/legacy/share/translations/ga.txt +++ /dev/null @@ -1,81 +0,0 @@ -113: Geal : Clear -113: Grianmhar : Sunny -116: Breacscamallach : Partly cloudy -119: Scamallach : Cloudy -122: Scamallach : Overcast -143: Ceochán : Mist -176: Ceathanna : Patchy rain possible -179: Ceathanna sneachta : Patchy snow possible -182: Ceathanna flichshneachta : Patchy sleet possible -185: Ceathanna cloichshneachta : Patchy freezing drizzle possible -200: Ceathanna toirní : Thundery outbreaks possible -227: Stealladh sneachta : Blowing snow -230: Síobadh sneachta : Blizzard -248: Ceo : Fog -260: Ceo reoite : Freezing fog -263: Ceobhrán : Patchy light drizzle -266: Ceobhrán éadrom : Light drizzle -281: Ceobhrán reoite : Freezing drizzle -284: Ceobhrán reoite trom : Heavy freezing drizzle -293: Breachbháisteach éadrom : Patchy light rain -296: Báisteach éadrom : Light rain -299: Báisteach mheasartha uaireanta : Moderate rain at times -302: Báisteach mheasartha : Moderate rain -305: Báisteach throm uairanta : Heavy rain at times -308: Báisteach throm : Heavy rain -311: Báisteach reoite éadrom : Light freezing rain -314: Báisteach mheasartha nó reoite throm : Moderate or heavy freezing rain -317: Flichshneachta éadrom : Light sleet -320: Flichshneachta measartha nó trom : Moderate or heavy sleet -323: Breacsneachta éadrom : Patchy light snow -326: Sneachta éadrom : Light snow -329: Breacsneachta measartha : Patchy moderate snow -332: Sneachta measartha : Moderate snow -335: Sneachta trom uaireanta : Patchy heavy snow -338: Sneachta trom : Heavy snow -350: Chloichshneachta : Ice pellets -353: Cith éadrom : Light rain shower -356: Cith measartha no trom : Moderate or heavy rain shower -359: Duartan : Torrential rain shower -362: Ceathanna flichshneachta : Light sleet showers -365: Ceathanna flichshneachta measartha nó troma : Moderate or heavy sleet showers -368: Ceathanna sneachta éadroma : Light snow showers -371: Ceathanna sneachta measartha nó troma : Moderate or heavy snow showers -386: Ceathanna éadroma le toirneach : Patchy light rain with thunder -389: Báisteach measartha nó throm le tóirneach : Moderate or heavy rain with thunder -392: Sneachta éadrom le toirneach : Patchy light snow with thunder -395: Sneachta measartha nó trom le toirneach : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/he.txt b/legacy/share/translations/he.txt deleted file mode 100644 index 02813c4..0000000 --- a/legacy/share/translations/he.txt +++ /dev/null @@ -1,47 +0,0 @@ -113 : בהיר: Clear -113 : שמשי: Sunny -116 : מעונן חלקית : Partly cloudy -119 : מעונן : Cloudy -122 : מעונן : Overcast -143 : ערפל : Mist -176 : סיכוי לגשם מקומי : Patchy rain possible -179 : סיכוי לשלג מקומי : Patchy snow possible -182 : סיכוי לגשם מעורב בשלג מקומי : Patchy sleet possible -185 : סיכוי לברד מקומי : Patchy freezing drizzle possible -200 : סיכוי לסופת ברקים : Thundery outbreaks possible -227 : משבי שלג : Blowing snow -230 : סופת שלג : Blizzard -248 : ערפל : Fog -260 : קרה : Freezing fog -263 : ברד מקומי קל : Patchy light drizzle -266 : ברד קל : Light drizzle -281 : ברד : Freezing drizzle -284 : ברד כבד : Heavy freezing drizzle -293 : גשם מקומי קל : Patchy light rain -296 : גשם קל : Light rain -299 : גשם לסירוגין : Moderate rain at times -302 : גשם : Moderate rain -305 : גשם כבד לסירוגין : Heavy rain at times -308 : גשם כבד : Heavy rain -311 : גשם קופא קל : Light freezing rain -314 : גשם קופא בינוני עד כבד : Moderate or heavy freezing rain -317 : גשם מעורב בשלג קל : Light sleet -320 : גשם מעורב בשלג בינוני עד כבד : Moderate or heavy sleet -323 : שלג מקומי קל : Patchy light snow -326 : שלג קל : Light snow -329 : שלג מקומי בינוני : Patchy moderate snow -332 : שלג בינוני : Moderate snow -335 : שלג מקומי כבד : Patchy heavy snow -338 : שלג כבד : Heavy snow -350 : ברד : Ice pellets -353 : גשם קל : Light rain shower -356 : גשם בינוני עד כבד : Moderate or heavy rain shower -359 : ממטרים כבדים : Torrential rain shower -362 : גשם מעורב בשלג קל : Light sleet showers -365 : גשם מעורב בשלג בינוני עד כבד : Moderate or heavy sleet showers -368 : שלג קל : Light snow showers -371 : שלג בינוני עד כבד : Moderate or heavy snow showers -386 : גשם מקומי קל ורעמים : Patchy light rain with thunder -389 : גשם בינוני עד כבד ורעמים : Moderate or heavy rain with thunder -392 : שלג קל ורעמים : Patchy light snow with thunder -395 : שלג בינוני עד כבד ורעמים : Moderate or heavy snow with thunder \ No newline at end of file diff --git a/legacy/share/translations/hr.txt b/legacy/share/translations/hr.txt deleted file mode 100644 index 67fb60c..0000000 --- a/legacy/share/translations/hr.txt +++ /dev/null @@ -1,48 +0,0 @@ -: Kiša : Rain -113 : Vedro : Clear -113 : Sunčano : Sunny -116 : Djelomično oblačno : Partly cloudy -119 : Oblačno : Cloudy -122 : Tmurno : Overcast -143 : Magla : Mist -176 : Moguća povremena kiša : Patchy rain possible -179 : Moguć povremeni snijeg : Patchy snow possible -182 : Moguća povremena susnježica : Patchy sleet possible -185 : Moguća ledena rosulja : Patchy freezing drizzle possible -200 : Moguć prolom oblaka : Thundery outbreaks possible -227 : Nanosi snijega : Blowing snow -230 : Mećava : Blizzard -248 : Magla : Fog -260 : Ledena magla : Freezing fog -263 : Povremena rosulja : Patchy light drizzle -266 : Lagana rosulja : Light drizzle -281 : Ledena rosulja : Freezing drizzle -284 : Jaka ledena rosulja : Heavy freezing drizzle -293 : Povremena lagana kiša : Patchy light rain -296 : Lagana kiša : Light rain -299 : Umjerena povremena kiša : Moderate rain at times -302 : Umjerena kiša : Moderate rain -305 : Povremeni pljuskovi : Heavy rain at times -308 : Jaka kiša : Heavy rain -311 : Lagana ledena kiša : Light freezing rain -314 : Umjerena ili jaka ledena kiša : Moderate or heavy freezing rain -317 : Lagana susnježica : Light sleet -320 : Umjerena ili jaka susnježica : Moderate or heavy sleet -323 : Povremen lagan snijeg : Patchy light snow -326 : Lagan snijeg : Light snow -329 : Povremen umjeren snijeg : Patchy moderate snow -332 : Umjeren snijeg : Moderate snow -335 : Povremen jak snijeg : Patchy heavy snow -338 : Jak snijeg : Heavy snow -350 : Ledena tuča : Ice pellets -353 : Lagani pljusak : Light rain shower -356 : Umjeren ili jak pljusak : Moderate or heavy rain shower -359 : Obilan pljusak : Torrential rain shower -362 : Lagana susnježica : Light sleet showers -365 : Umjerena ili jaka susnježica : Moderate or heavy sleet showers -368 : Lagani snježni pljuskovi : Light snow showers -371 : Umjereni ili jaki snježni pljuskovi : Moderate or heavy snow showers -386 : Povremena lagana kiša s grmljavinom : Patchy light rain with thunder -389 : Umjerena ili jaka kiša s grmljavinom: Moderate or heavy rain with thunder -392 : Povremen lagan snijeg s grmljavinom : Patchy light snow with thunder -395 : Umjeren ili jak snijeg s grmljavinom: Moderate or heavy snow with thunder diff --git a/legacy/share/translations/hu-help.txt b/legacy/share/translations/hu-help.txt deleted file mode 100644 index 913b43a..0000000 --- a/legacy/share/translations/hu-help.txt +++ /dev/null @@ -1,69 +0,0 @@ -Használat: - - $ curl wttr.in # jelenlegi tartózkodási hely - $ curl wttr.in/muc # időjárás a müncheni repülőtéren - -Támogatott pozíciómeghatározások: - - /paris # város - /~Eiffel+tower # bármilyen hely - /Москва # Unicode név bármilyen nyelven - /muc # repülőtér kód (3 betű) - /@stackoverflow.com # domain név - /94107 # körzetszám - /-78.46,106.79 # GPS koordináták - -Speciális helyek: - - /moon # holdfázis (a végére tehető ,+US vagy ,+France például) - /moon@2016-10-25 # holdfázis az adott dátumhoz (@2016-10-25) - -Mértékegységek: - - m # metrikus (SI) (használatban mindenhol az USA kivételével) - u # USA hagyományos (alapértelmezett az USA-ban) - M # szélsebesség m/s-ban - -Megjelenítési beállítások: - - 0 # csak az aktuális időjárás - 1 # aktuális időjárás + 1 nap - 2 # aktuális időjárás + 2 nap - A # User-Agent figyelmen kívül hagyása, ANSI output kikényszerítése (terminálokban) - F # ne jeneítse meg a "Kövesd" sort - n # keskeny változat (csak nappal és éjszaka) - q # csendes verzió ("Időjárás előrejelzés" szöveg nélkül) - Q # szupercsendes verzió ("Időjárás előrejelzés" szöveg és hely nélkül) - T # terminál szekvenciák kikapcsolása (színek nélküli megjelenés) - -PNG beállítások: - - /paris.png # PNG kép készítése - p # keret a kép köré - t # 150-es "átlátszóság" - transparency=... # "átlátszóság" 0 és 255 között (255 = egyáltalán nem átlátszó) - -A beállítások kombinálhatók: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # PNG módban az opciók egy aláhúzásjel után megadhatók - /Rome_0pq_lang=it.png # a hosszú opcióneveket aláhúzásjelekkel kell elválasztani - -Megjelenítés különböző nyelveken: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Támogatott nyelvek: - - FULL_TRANSLATION (teljesen támogatott) - PARTIAL_TRANSLATION (folyamatban...) - -Speciális URL-ek: - - /:help # segítség (ez az oldal) - /:bash.function # ajánlott bash függvény - /:translation # információ a fordítókról - diff --git a/legacy/share/translations/hu.txt b/legacy/share/translations/hu.txt deleted file mode 100644 index 88d79b7..0000000 --- a/legacy/share/translations/hu.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Tiszta : Clear -113: Napos : Sunny -116: Részben felhős : Partly cloudy -119: Felhős : Cloudy -122: Borult : Overcast -143: Köd : Mist -176: Szórványos zápor előfordulhat : Patchy rain possible -179: Szórványos havazás előfordulhat : Patchy snow possible -182: Szórványos havas eső előfordulhat : Patchy sleet possible -185: Szórványos ónos eső előfordulhat : Patchy freezing drizzle possible -200: Viharos széllökések előfordulhatnak : Thundery outbreaks possible -227: Hófúvás : Blowing snow -230: Hóvihar : Blizzard -248: Köd : Fog -260: Jeges köd : Freezing fog -263: Szórványosan enyhe ónos eső : Patchy light drizzle -266: Gyenge ónos eső : Light drizzle -281: Ónos eső : Freezing drizzle -284: Erős ónos eső : Heavy freezing drizzle -293: Szórványosan gyenge eső : Patchy light rain -296: Gyenge eső : Light rain -299: Időnként eső : Moderate rain at times -302: Eső : Moderate rain -305: Időnként intenzív eső : Heavy rain at times -308: Intenzív eső : Heavy rain -311: Enyhe jéges eső : Light freezing rain -314: Jéges eső : Moderate or heavy freezing rain -317: Enyhe havas eső : Light sleet -320: Havas eső : Moderate or heavy sleet -323: Szórványos hószállingózás : Patchy light snow -326: Hószállingózás : Light snow -329: Szórványos havazás : Patchy moderate snow -332: Havazás : Moderate snow -335: Szórványosan intenzív havazás : Patchy heavy snow -338: Intenzív havazás : Heavy snow -350: Jégeső : Ice pellets -353: Enyhe zápor : Light rain shower -356: Zápor : Moderate or heavy rain shower -359: Zuhogó eső : Torrential rain shower -362: Enyhe havas eső : Light sleet showers -365: Havas eső : Moderate or heavy sleet showers -368: Hószállingózás : Light snow showers -371: Havazás : Moderate or heavy snow showers -386: Szórványos zivatar : Patchy light rain with thunder -389: Zivatar : Moderate or heavy rain with thunder -392: Szórványos hózivatar : Patchy light snow with thunder -395: Hózivatar : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/hy.txt b/legacy/share/translations/hy.txt deleted file mode 100644 index 32f59b6..0000000 --- a/legacy/share/translations/hy.txt +++ /dev/null @@ -1,81 +0,0 @@ -113: Պարզ : Clear : Ясно -113: Արևոտ : Sunny : Солнечно -116: Մասամբ ամպամած : Partly cloudy : Переменная облачность -119: Ամպամած : Cloudy : Облачно -122: Ամպամած : Overcast : Пасмурно -143: Խոնավ : Mist : Дымка -176: Տեղ-տեղ անձրև : Patchy rain possible : Местами дождь -179: Տեղ-տեղ ձյուն : Patchy snow possible : Местами снег -182: Տեղ-տեղ ձյունախառն անձրև : Patchy sleet possible : Местами дождь со снегом -185: Տեղ-տեղ սառեցնող մրրիկ : Patchy freezing drizzle possible : Местами замерзающая морось -200: Ամպրոպ : Thundery outbreaks possible : Местами грозы -227: Ձնաբուք : Blowing snow : Поземок -230: Ձնաբուք : Blizzard : Метель -248: Մառախուղ : Fog : Туман -260: Սառեցնող մառախուղ : Freezing fog : Переохлажденный туман -263: Տեղ-տեղ թույլ մրրիկ : Patchy light drizzle : Местами слабая морось -266: Թույլ մրրիկ : Light drizzle : Слабая морось -281: Սառեցնող մրրիկ : Freezing drizzle : Замерзающая морось -284: ՈՒժեղ սառեցնող մրրիկ : Heavy freezing drizzle : Сильная замерзающая морось -293: Տեղ-տեղ թույլ անձրև : Patchy light rain : Местами небольшой дождь -296: Թույլ անձրև : Light rain : Небольшой дождь -299: Չափավոր անձրև երբեմն : Moderate rain at times : Временами умеренный дождь -302: Չափավոր անձրև : Moderate rain : Умеренный дождь -305: Ուժեղ անձրև երբեմն : Heavy rain at times : Временами сильный дождь -308: Ուժեղ անձրև : Heavy rain : Сильный дождь -311: Թույլ սառեցնող անձրև : Light freezing rain : Слабый переохлажденный дождь -314: Չափավոր կամ ուժեղ սառեցնող անձրև : Moderate or heavy freezing rain : Умеренный или сильный переохлажденный дождь -317: Թույլ մանրակարկուտ : Light sleet : Небольшой дождь со снегом -320: Չափավոր կամ ուժեղ մանրակարկուտ : Moderate or heavy sleet : Умеренный или сильный дождь со снегом -323: Տեղ-տեղ թույլ ձյուն : Patchy light snow : Местами небольшой снег -326: Թույլ ձյուն : Light snow : Небольшой снег -329: Տեղ-տեղ չափավոր ձյուն : Patchy moderate snow : Местами умеренный снег -332: Չափավոր ձյուն : Moderate snow : Умеренный снег -335: Տեղ-տեղ ուժեղ ձյուն : Patchy heavy snow : Местами сильный снег -338: ՈՒժեղ ձյուն : Heavy snow : Сильный снег -350: Սառցաբեկորներ : Ice pellets : Ледяной дождь -353: Թույլ տեղատարափ անձրև : Light rain shower : Небольшой ливневый дождь -356: Չափավոր կամ ուժեղ տեղատարափ անձրև : Moderate or heavy rain shower : Умеренный или сильный ливневый дождь -359: Ուժեղ տեղատարափ անձրև : Torrential rain shower : Очень сильный ливень -362: Թույլ ձյունախառն անձրև : Light sleet showers : Небольшой ливневый дождь со снегом -365: Չափավոր կամ ուժեղ ձյունախառն անձրև ։ Moderate or heavy sleet showers : Небольшой снег -368: Թույլ ձյունախառն անձրև : Light snow showers : Небольшой ливневый дождь со снегом -371: Չափավոր կամ ուժեղ ձյան տարափ : Moderate or heavy snow showers : Умеренный или сильный снежный ливень -386: Տեղ-տեղ թույլ անձրև և ամպրոպ : Patchy light rain with thunder : Местами небольшой дождь с грозой -389: Չափավոր կամ ուժեղ անձրև և ամպրոպ : Moderate or heavy rain with thunder : Умеренный или сильный дождь с грозой -392: Տեղ-տեղ թույլ ձյուն և ամպրոպ : Patchy light snow with thunder : Местами небольшой снег с грозой -395: Ուժեղ ձյուն և ամպրոպ : Moderate or heavy snow with thunder : Умеренный или сильный снег с грозой - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/ia-help.txt b/legacy/share/translations/ia-help.txt deleted file mode 100644 index f1cbb5b..0000000 --- a/legacy/share/translations/ia-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Instructiones: - - $ curl wttr.in # le tempore a vostre location actual - $ curl wttr.in/muc # le tempore del aeroporto de Múnich - -Typos de location appoiava: - - /paris # le nomine de un citate - /~Eiffel+tower # le nomine de qualque sito famose - /Москва # le nomine Unicode de qualque sito in qualque lingua - /muc # le codice de un aeroporto (3 litteras) - /@stackoverflow.com # le nomine de un dominio internet - /94107 # un codice de area - /-78.46,106.79 # coordinatas de GPS - -Sitos speciales: - - /moon # le phase del luna (adjunge ,+US o ,+France por iste paises) - /moon@2016-10-25 # le phase del luna in un data specific (@2016-10-25) - -Unitates: - - ?m # metric (SI) (le standardo in tote le sitos extra in EEUU) - ?u # Systema Uniforme de Classification del Solo o USCS (le standardo in EEUU) - ?M # demonstrar le velocitate del vento in m/s - -Optiones visual: - - ?0 # solmente le tempore actual - ?1 # le tempore actual + le prevision de 1 die - ?2 # le tempore actual + le prevision de 2 die - ?n # version curte (solmente le die et le nocte) - ?q # version silentiose (sin le texto de "Le tempore a") - ?Q # version supersilentiose (nec "Le tempore a" nec le nomine del citate) - ?T # desactiva le sequentias de terminal (sin colores) - -Optiones de PNG: - - /paris.png # genera un imagine PNG - ?p # adde un frontiera circa le imagine - ?t # transparentia 150 - transparency=... # transparentia de 0 a 255 (255 = sin transparentia) - -Le optiones pote usar insimul: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # in PNG le optiones sera post que le character _ - /Rome_0pq_lang=it.png # un grande secuentia de optiones pote seperate per le character _ - -Location: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Linguas appoiava: - - FULL_TRANSLATION (appoiava) - PARTIAL_TRANSLATION (in progresso) - -URLs speciales: - - /:help # monstra isto pagina - /:bash.function # proponera un function wttr() in bash - /:translation # monstra aviso super le traductores diff --git a/legacy/share/translations/ia.txt b/legacy/share/translations/ia.txt deleted file mode 100644 index 7d882fa..0000000 --- a/legacy/share/translations/ia.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Clar : Clear -113: Allegre : Sunny -116: Pauc Nubilose : Partly cloudy -119: Nubilose : Cloudy -122: Gris : Overcast -143: Nebula : Mist -176: Pauc pluvia possibile : Patchy rain possible -179: Pauc nive possibile : Patchy snow possible -182: Pauc nive miscite con pluvia : Patchy sleet possible -185: Pauc nive glacial con pluvia : Patchy freezing drizzle possible -200: Rar tonitro possibile : Thundery outbreaks possible -227: Ventose nive : Blowing snow -230: Tempesta de nive : Blizzard -248: Bruma : Fog -260: Bruma glacial : Freezing fog -263: Pauc pluvia : Patchy light drizzle -266: Pluveva : Light drizzle -281: Pluveva glacial : Freezing drizzle -284: Multe pluvia glacial : Heavy freezing drizzle -293: Pauc pluvia : Patchy light rain -296: Pluveva : Light rain -299: Pluvia moderate a vices : Moderate rain at times -302: Pluvia moderate : Moderate rain -305: Multe pluvia a vices : Heavy rain at times -308: Multe pluvia : Heavy rain -311: Pauc pluvia glacial : Light freezing rain -314: Multe o moderate pluvia glacial : Moderate or heavy freezing rain -317: Pauc nive miscite con pluvia : Light sleet -320: Multe o moderate nive miscite : Moderate or heavy sleet -323: Breve nive : Patchy light snow -326: Pauc nive : Light snow -329: Breve nive moderate : Patchy moderate snow -332: Nive moderate : Moderate snow -335: Multe nive a veces : Patchy heavy snow -338: Multe nive : Heavy snow -350: Bolletas de glacie : Ice pellets -353: Pauc pluvia : Light rain shower -356: Multe o moderate pluvia : Moderate or heavy rain shower -359: Tempesta de pluvia : Torrential rain shower -362: Pauc pluvia con glacie : Light sleet showers -365: Multe o moderate pluvia con glacie : Moderate or heavy sleet showers -368: Pauc nive con pluvia : Light snow showers -371: Multe o moderate nive con pluvia : Moderate or heavy snow showers -386: Pauc pluvia con tonitro : Patchy light rain with thunder -389: Moderate pluvia con tonitro : Moderate or heavy rain with thunder -392: Pauc nive con tonitro : Patchy light snow with thunder -395: Moderate o multe nive con tonitro : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/id-help.txt b/legacy/share/translations/id-help.txt deleted file mode 100644 index 191a477..0000000 --- a/legacy/share/translations/id-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Cara penggunaan: - - $ curl wttr.in # lokasi saat ini - $ curl wttr.in/muc # cuaca di bandara Munich - -Dukungan tipe lokasi: - - /paris # nama kota - /~Eiffel+tower # sembarang lokasi - /Москва # nama Unicode dari semabarang lokasi dalam sembarang bahasa - /muc # kode bandara (3 huruf) - /@stackoverflow.com # nama domain - /94107 # kode area - /-78.46,106.79 # koordinat GPS - -Lokasi khusus: - - /moon # bentuk Bulan (tambahkan ,+US atau ,+France untuk kota-kota tersebut) - /moon@2016-10-25 # bentuk Bulan untuk tanggal (@2016-10-25) - -Satuan: - - ?m # metrik (SI) (digunakan sebagai standar di semua tempat kecuali US) - ?u # USCS (digunakan sebagai standar di US) - ?M # tampilkan kecepatan angin dalam m/s - -Opsi tampilan: - - ?0 # hanya cuaca saat ini - ?1 # cuaca saat ini + 1 hari - ?2 # cuaca saat ini + 2 hari - ?n # versi sempit (hanya siang dan malam) - ?q # versi diam (tanpa teks "Laporan cuaca") - ?Q # versi sangat diam (tanpa teks "Laporan cuaca", tanpa nama kota) - ?T # ganti urutan terminal (tanpa warna) - -Opsi PNG: - - /paris.png # hasilkan suatu berkas PNG - ?p # tambahkan bingkai di sekeliling hasil - ?t # transparansi 150 - transparency=... # transparansi dari 0 sampai 255 (255 = tidak transparan) - -Opsi dapat digabung: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # dalam PNG mode berkas ditentukan sesudah _ - /Rome_0pq_lang=it.png # opsi panjang dipisahkan dengan underscore - -Lokalisasi: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Dukungan bahasa: - - FULL_TRANSLATION (supported) - PARTIAL_TRANSLATION (in progress) - -URL khusus: - - /:help # tampilkan halaman ini - /:bash.function # tampilkan fungsi bash yang direkomendasikan wttr() - /:translation # tampilkan informasi tentang translator - diff --git a/legacy/share/translations/id.txt b/legacy/share/translations/id.txt deleted file mode 100644 index cb5575b..0000000 --- a/legacy/share/translations/id.txt +++ /dev/null @@ -1,81 +0,0 @@ -113: Langit bersih : Clear -113: Cerah : Sunny -116: Sebagian berawan : Partly cloudy -119: Berawan : Cloudy -122: Mendung : Overcast -143: Berkabut : Mist -176: Mungkin hujan tidak merata : Patchy rain possible -179: Mungkin bersalju tidak merata : Patchy snow possible -182: Mungkin hujan es tidak merata : Patchy sleet possible -185: Mungkin gerimis beku tidak merata : Patchy freezing drizzle possible -200: Mungkin banyak petir : Thundery outbreaks possible -227: Hembusan salju : Blowing snow -230: Badai salju : Blizzard -248: Kabut : Fog -260: Kabut beku : Freezing fog -263: Gerimis ringan tidak merata : Patchy light drizzle -266: Gerimis ringan : Light drizzle -281: Gerimis beku : Freezing drizzle -284: Gerimis beku rapat : Heavy freezing drizzle -293: Hujan ringan tidak merata : Patchy light rain -296: Hujan ringan : Light rain -299: Hujan di beberapa waktu : Moderate rain at times -302: Hujan : Moderate rain -305: Hujan lebat di beberapa waktu : Heavy rain at times -308: Hujan lebat : Heavy rain -311: Hujan beku ringan : Light freezing rain -314: Hujan beku : Moderate or heavy freezing rain -317: Hujan es ringan : Light sleet -320: Hujan es : Moderate or heavy sleet -323: Salju ringan tidak merata : Patchy light snow -326: Salju ringan : Light snow -329: Salju tidak merata : Patchy moderate snow -332: Salju : Moderate snow -335: Salju lebat tidak merata : Patchy heavy snow -338: Salju lebat : Heavy snow -350: Bongkahan es : Ice pellets -353: Hujan ringan : Light rain shower -356: Hujan lebat : Moderate or heavy rain shower -359: Hujan sangat lebat : Torrential rain shower -362: Hujan es ringan : Light sleet showers -365: Hujan es : Moderate or heavy sleet showers -368: Hujan salju ringan : Light snow showers -371: Hujan salju : Moderate or heavy snow showers -386: Hujan ringan dengan petir tidak merata : Patchy light rain with thunder -389: Hujan dengan petir : Moderate or heavy rain with thunder -392: Salju ringan dengan petir tidak merata : Patchy light snow with thunder -395: Salju dengan petir : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/is.txt b/legacy/share/translations/is.txt deleted file mode 100644 index 2a64b65..0000000 --- a/legacy/share/translations/is.txt +++ /dev/null @@ -1,47 +0,0 @@ -113 : Heiðskýrt : Clear -113 : Sól : Sunny -116 : Léttskýjað : Partly cloudy -119 : Skýjað : Cloudy -122 : Alskýjað : Overcast -143 : Mistur : Mist -176 : Hætta á rigningu á köflum : Patchy rain possible -179 : Hætta á snjókomu á köflum : Patchy snow possible -182 : Hætta á slyddu á köflum : Patchy sleet possible -185 : Hætta á frostúða á köflum : Patchy freezing drizzle possible -200 : Hætta á þrumuveðri : Thundery outbreaks possible -227 : Skafrenningur : Blowing snow -230 : Snjóbylur : Blizzard -248 : Þoka : Fog -260 : Frostþoka : Freezing fog -263 : Lítilsháttar súld á köflum : Patchy light drizzle -266 : Lítilsháttar súld : Light drizzle -281 : Frostúði : Freezing drizzle -284 : Mikill frostúði : Heavy freezing drizzle -293 : Lítilsháttar rigning á köflum : Patchy light rain -296 : Lítilsháttar rigning : Light rain -299 : Dálítil rigning á köflum : Moderate rain at times -302 : Dálítil rigning : Moderate rain -305 : Mikil rigning á köflum : Heavy rain at times -308 : Mikil rigning : Heavy rain -311 : Lítilsháttar frostrigning : Light freezing rain -314 : Dálítið eða mikið frostregn : Moderate or heavy freezing rain -317 : Lítilsháttar slydda : Light sleet -320 : Dálítil eða mikil slydda : Moderate or heavy sleet -323 : Lítilsháttar snjókoma á köflum : Patchy light snow -326 : Lítilsháttar snjókoma : Light snow -329 : Dálítil snjókoma á köflum : Patchy moderate snow -332 : Dálítil snjókoma : Moderate snow -335 : Mikill snjókoma á köflum : Patchy heavy snow -338 : Mikill snjókoma : Heavy snow -350 : Haglél : Ice pellets -353 : Skúrir : Light rain shower -356 : Dálitlir eða mikilir Skúrir : Moderate or heavy rain shower -359 : Úrhellis rigning : Torrential rain shower -362 : Slydduél : Light sleet showers -365 : Dálítil eða mikil slydduél : Moderate or heavy sleet showers -368 : Lítilshátta Snjóél : Light snow showers -371 : Dálítil eða mikil snjóél : Moderate or heavy snow showers -386 : Lítilsháttar skúrir með þrumuveðri á köflum : Patchy light rain with thunder -389 : Dálítil eða mikil rigning með þrumuveðri : Moderate or heavy rain with thunder -392 : Lítilsháttar él með þrumuveðri á köflum : Patchy light snow with thunder -395 : Dálítil eða mikill snjórkoma með þrumuveðri : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/it.txt b/legacy/share/translations/it.txt deleted file mode 100644 index 1ac6a17..0000000 --- a/legacy/share/translations/it.txt +++ /dev/null @@ -1,81 +0,0 @@ -113: Sereno : Clear -113: Soleggiato : Sunny -116: Parzialmente nuvoloso : Partly cloudy -119: Nuvoloso : Cloudy -122: Coperto : Overcast -143: Nebbia : Mist -176: Possibile pioggia a zone : Patchy rain possible -179: Possibili nevicate a zone : Patchy snow possible -182: Possibile nevischio a zone : Patchy sleet possible -185: Possibile pioviggine ghiacciata : Patchy freezing drizzle possible -200: Possibili violenti temporali improvvisi : Thundery outbreaks possible -227: Neve a raffiche : Blowing snow -230: Bufera di neve : Blizzard -248: Nebbia : Fog -260: Nebbia gelata : Freezing fog -263: Pioggerellina leggera a zone : Patchy light drizzle -266: Pioggerellina leggera : Light drizzle -281: Pioggia gelata : Freezing drizzle -284: Pioviggine ghiacciata : Heavy freezing drizzle -293: Pioggia leggera a zone : Patchy light rain -296: Pioggia leggera : Light rain -299: Pioggia moderata irregolare : Moderate rain at times -302: Pioggia moderata : Moderate rain -305: Pioggia forte irregolare : Heavy rain at times -308: Pioggia forte : Heavy rain -311: Pioggia leggera ghiacciata : Light freezing rain -314: Pioggia gelata moderata o pesante : Moderate or heavy freezing rain -317: Nevischio leggero : Light sleet -320: Nevischio moderato o pesante : Moderate or heavy sleet -323: Neve leggera a zone chiare : Patchy light snow -326: Neve leggera : Light snow -329: Neve moderata a zone : Patchy moderate snow -332: Neve moderata : Moderate snow -335: Abbondante nevicata a zone : Patchy heavy snow -338: Abbondante nevicata : Heavy snow -350: Grandine : Ice pellets -353: Pioggia leggera a scrosci : Light rain shower -356: Pioggia moderata o intensa a scrosci : Moderate or heavy rain shower -359: Piogge torrenziali a scrosci : Torrential rain shower -362: Nevischio leggero a colpi : Light sleet showers -365: Rovesci di pioggia moderati o pesanti : Moderate or heavy sleet showers -368: Deboli rovesci di neve : Light snow showers -371: Rovesci di neve moderati o abbondanti : Moderate or heavy snow showers -386: Pioggia leggera con tuoni e fulmini : Patchy light rain with thunder -389: Pioggia moderata o intensa con tuoni e fulmini : Moderate or heavy rain with thunder -392: Neve leggera a zone con tuoni : Patchy light snow with thunder -395: Neve moderata o pesante con tuoni : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/ja.txt b/legacy/share/translations/ja.txt deleted file mode 100644 index 95bafe1..0000000 --- a/legacy/share/translations/ja.txt +++ /dev/null @@ -1,82 +0,0 @@ -113: 快晴 : Clear -113: 晴れ : Sunny -116: 所により曇り : Partly cloudy -119: 曇り : Cloudy -122: 曇り : Overcast -143: 靄 : Mist -176: 所により雨 : Patchy rain possible -179: 所により雪 : Patchy snow possible -182: 所により凍雨 : Patchy sleet possible -185: 所により着氷性の霧雨 : Patchy freezing drizzle possible -200: 雷雨の発生 : Thundery outbreaks possible -227: 吹雪 : Blowing snow -230: 猛吹雪 : Blizzard -248: 霧 : Fog -260: 着氷性の霧 : Freezing fog -263: 所により弱い霧雨 : Patchy light drizzle -266: 弱い霧雨 : Light drizzle -281: 着氷性の霧雨 : Freezing drizzle -284: 強い着氷性の霧雨 : Heavy freezing drizzle -293: 所により弱い雨 : Patchy light rain -296: 弱い雨 : Light rain -299: 時々雨 : Moderate rain at times -302: 雨 : Moderate rain -305: 時々強い雨 : Heavy rain at times -308: 強い雨 : Heavy rain -311: 弱い着氷性の雨 : Light freezing rain -314: 着氷性の雨または強い着氷性の雨 : Moderate or heavy freezing rain -317: 弱い凍雨 : Light sleet -320: 凍雨または強い凍雨 : Moderate or heavy sleet -323: 所により弱い雪 : Patchy light snow -326: 弱い雪 : Light snow -329: 所により雪 : Patchy moderate snow -332: 雪 : Moderate snow -335: 所により強い雪 : Patchy heavy snow -338: 強い雪 : Heavy snow -350: 凍雨 : Ice pellets -353: 弱い驟雨 : Light rain shower -356: 驟雨または強い驟雨 : Moderate or heavy rain shower -359: 激しい驟雨 : Torrential rain shower -362: 弱い凍雨 : Light sleet showers -365: 凍雨または強い凍雨 : Moderate or heavy sleet showers -368: 弱い驟雪 : Light snow showers -368: 弱い雨と驟雪と靄 : Light Rain And Snow Shower, Mist -371: 驟雪または強い驟雪 : Moderate or heavy snow showers -386: 所により雷を伴う弱い雨 : Patchy light rain with thunder -389: 雷を伴う雨または強い雨 : Moderate or heavy rain with thunder -392: 所により雷を伴う弱い雪 : Patchy light snow with thunder -395: 雷を伴う雪または強い雪 : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/kk-help.txt b/legacy/share/translations/kk-help.txt deleted file mode 100644 index 2e28a61..0000000 --- a/legacy/share/translations/kk-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Использование: - - $ curl wttr.in # текущее местоположение - $ curl wttr.in/svo # погода в аэропорту Шереметьево (код ICAO: SVO) - -Поддерживаемые типы местоположений: - - /paris # город - /~Eiffel+tower # любое местоположение - /Москва # юникодное имя любого местоположения на любом языке - /muc # код аэропорта ICAO (3 буквы) - /@stackoverflow.com # доменное имя - /94107 # почтовый индекс (только для США) - /-78.46,106.79 # GPS-координаты - -Специальные условные местоположения: - - /moon # Фаза Луны (добавьте ,+US или ,+France для города Moon в США/Франции) - /moon@2016-10-25 # Фаза Луны для указанной даты (@2016-10-25) - -Единицы измерений: - - ?m # метрические (СИ) (используются везде кроме США) - ?u # USCS (используются в США) - ?M # показывать скорость ветра в м/с - -Опции отображения: - - ?0 # только текущая погода - ?1 # погода сегодня + 1 день - ?2 # погода сегодня + 2 дня - ?n # узкая версия (только день и ночь) - ?q # тихая версия (без текста "Прогноз погоды") - ?Q # сверхтихая версия (без "Прогноз погоды", нет названия города) - ?T # отключить терминальные последовательности (без цветов) - -PNG-опции: - - /paris.png # сгенерировать PNG-файл - ?p # добавить рамочку вокруг - ?t # transparency=150 (прозрачность 150) - transparency=... # прозрачность от 0 до 255 (255 = не прозрачный) - -Опции можно комбинировать: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # в PNG-запросах опции указываются после _ - /Rome_0pq_lang=it.png # длинные опции разделяются знаком подчёркивания _ - -Локализация: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Поддерживаемые языки: - - FULL_TRANSLATION (поддерживаются) - PARTIAL_TRANSLATION (в процессе) - -Специальные страницы: - - /:help # показать эту страницу - /:bash.function # показать рекомендованную функцию wttr() - /:translation # показать список переводчиков wttr.in - diff --git a/legacy/share/translations/kk.txt b/legacy/share/translations/kk.txt deleted file mode 100644 index 6eded53..0000000 --- a/legacy/share/translations/kk.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Ашық : Clear : Ясно -113: Шуақ күн : Sunny : Солнечно -116: Көшпелі бұлт : Partly cloudy : Переменная облачность -119: Күн бұлтты : Cloudy : Облачно -122: Бұлыңғыр күн : Overcast : Пасмурно -143: Мұнар : Mist : Дымка -176: Кей жерлерде жаңбыр жауады : Patchy rain possible : Местами дождь -179: Кей жерлерде кар жауады : Patchy snow possible : Местами снег -182: Кей жерлерде қар және жауын аралас : Patchy sleet possible : Местами дождь со снегом -185: Кей жерлерде үсік сіркіреме : Patchy freezing drizzle possible : Местами замерзающая морось -200: Кей жерлерде найзағай : Thundery outbreaks possible : Местами грозы -227: Жаяу бұрқасын : Blowing snow : Поземок -230: Бұрқасын : Blizzard : Метель -248: Тұман : Fog : Туман -260: Аса суықтау тұман : Freezing fog : Переохлажденный туман -263: Кей жерлерде әлсіз аяз : Patchy light drizzle : Местами слабая морось -266: Әлсіз аяз : Light drizzle : Слабая морось -281: Қақаған аяз : Freezing drizzle : Замерзающая морось -284: Қатты қақаған аяз : Heavy freezing drizzle : Сильная замерзающая морось -293: Кей жерлерде аз ғана жаңбыр : Patchy light rain : Местами небольшой дождь -296: Аздаған жаңбыр : Light rain : Небольшой дождь -299: Орташа жауын кезеңдері : Moderate rain at times : Временами умеренный дождь -302: Орташа жауын : Moderate rain : Умеренный дождь -305: Қатты жауын кезеңдері : Heavy rain at times : Временами сильный дождь -308: Қатты жаңбыр : Heavy rain : Сильный дождь -311: Әлсіз суықтау жаңбыр : Light freezing rain : Слабый переохлажденный дождь -314: Орташа немесе қатты суықтау жаңбыр : Moderate or heavy freezing rain : Умеренный или сильный переохлажденный дождь -317: Аздаған жаңбыр аралас қар : Light sleet : Небольшой дождь со снегом -320: Орташа немесе қатты жаңбыр аралас қар : Moderate or heavy sleet : Умеренный или сильный дождь со снегом -323: Кей жерлерде аздаған қар : Patchy light snow : Местами небольшой снег -326: Аздаған қар : Light snow : Небольшой снег -329: Кей жерлерде орташа жауған қар : Patchy moderate snow : Местами умеренный снег -332: Орташа жауған қар : Moderate snow : Умеренный снег -335: Кей жерлерде қатты жауған қар : Patchy heavy snow : Местами сильный снег -338: Қатты жауған қар : Heavy snow : Сильный снег -350: Мұздай жаңбыр : Ice pellets : Ледяной дождь -353: Аздаған нөсер жауын : Light rain shower : Небольшой ливневый дождь -356: Орташа немесе қатты нөсер жауын : Moderate or heavy rain shower : Умеренный или сильный ливневый дождь -359: Өте қатты нөсер жауын : Torrential rain shower : Очень сильный ливень -362: Аздаған нөсер жауын аралас қар : Light sleet showers : Небольшой ливневый дождь со снегом -365: Аздаған қар : Moderate or heavy sleet showers : Небольшой снег -368: Аздаған нөсер жауын аралас қар : Light snow showers : Небольшой ливневый дождь со снегом -371: Орташа немесе қатты қарлы нөсер : Moderate or heavy snow showers : Умеренный или сильный снежный ливень -386: Кей жерлерде шамалы найзағайлы жауын : Patchy light rain with thunder : Местами небольшой дождь с грозой -389: Орташа немесе қатты найзағайлы нөсер : Moderate or heavy rain with thunder : Умеренный или сильный дождь с грозой -392: Кей жерлерде шамалы қар және найзағай : Patchy light snow with thunder : Местами небольшой снег с грозой -395: Орташа немесе қатты қар және найзағай : Moderate or heavy snow with thunder : Умеренный или сильный снег с грозой diff --git a/legacy/share/translations/lv-help.txt b/legacy/share/translations/lv-help.txt deleted file mode 100644 index 0bb5870..0000000 --- a/legacy/share/translations/lv-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Lietošana: - - $ curl wttr.in # pašreizējā atrašanās vieta - $ curl wttr.in/rix # laikapstākļi Rīgas lidostā - -Atbalstītie lokācijas tipi: - - /paris # pilsētas nosaukums - /~Eiffel+tower # jebkura dabas objekts - /Москва # Unicode nosaukums jebkurā valodā - /rix # lidostas kods (3 letters) - /@stackoverflow.com # Domēna vārds - /94107 # pasta indekss (tikai ASV) - /-78.46,106.79 # GPS koordinātes - -Speciālās atrašanās vietas: - - /moon # Mēness fāze (pievieno ,+US vai ,+France specifiskai pilsētai) - /moon@2016-10-25 # Mēness fāze datumā (@2016-10-25) - -Mērvienības: - - ?m # Metriskā sistēma (SI) (izmantoto kā standartu visās vietās izņemot ASV) - ?u # USCS (ASV vietām izmanto kā standartu) - ?M # vēja ātrums m/s - -Skata iespējas: - - ?0 # tikai pašreizējos laikapstākļus - ?1 # pašreizējos laikapstākļus + 1 dienu - ?2 # pašreizējos laikapstākļus + 2 dienas - ?n # īsā versija (tkai diena un nakts) - ?q # apgrieztā versija (bez "Laika ziņas" teksta) - ?Q # ļoti apgrieztā versija (bez "Laika ziņas" teksta, pilsētas nosaukuma) - ?T # rādīt nekrāsainu - -PNG iespējas: - - /paris.png # izveidot PNG failu - ?p # pievienot rāmi ap izvades failu - ?t # caurspīdīgums 150 - transparency=... # caurspīdīgums no 0 - 255 (255 = necaurspīdīgs) - -Parametrus var apvienot: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # PNG failā iestatījumi tiek rakstīti aiz _ - /Rome_0pq_lang=it.png # gari parametri tiek apvienoti ar _ - -Lokalizācija: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Atbalstītās valodas: - - FULL_TRANSLATION (Atbalstīts) - PARTIAL_TRANSLATION (Tiek strādāts pie tā) - -Īpašie URLs: - - /:help # parāda palīgā tekstu - /:bash.function # parāda ieteicamo bash funkciju wttr() - /:translation # parāda informāciju par tukojumiem diff --git a/legacy/share/translations/lv.txt b/legacy/share/translations/lv.txt deleted file mode 100644 index fb1f638..0000000 --- a/legacy/share/translations/lv.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Skaidrs : Clear : -113: Saulains : Sunny : -116: Daļēji mākoņains : Partly cloudy : -119: Mākoņains : Cloudy : -122: Apmācies : Overcast : -143: Viegla migla : Mist : -176: Vietām iespējams lietus : Patchy rain possible : -179: Vietām iespējams sniegs : Patchy snow possible : -182: Vietām iespējams sals : Patchy sleet possible : -185: Vietām iespējams auksts lietus : Patchy freezing drizzle possible : -200: Iespējams pērkons : Thundery outbreaks possible : -227: Sniegputenis : Blowing snow : -230: Sniega vētra : Blizzard : -248: Migla : Fog : -260: Auksta migla : Freezing fog : -263: Vietām viegli smidzina : Patchy light drizzle : -266: Viegli smidzina : Light drizzle : -281: Smalks un auksts lietus : Freezing drizzle : -284: Spēcīgs auksts lietus : Heavy freezing drizzle : -293: Vietām viegls lietus : Patchy light rain : -296: Viegls lietus : Light rain : -299: Īslaicīgs lietus : Moderate rain at times : -302: Lietus : Moderate rain : -305: Īslaicīgs stiprs lietus : Heavy rain at times : -308: Stiprs : Heavy rain : -311: Viegls un auksts lietus : Light freezing rain : -314: Mērens/Stiprs un auksts lietus : Moderate or heavy freezing rain : -317: Viegls un auksts lietus : Light sleet : -320: Mērens/Stiprs un auksts lietus : Moderate or heavy sleet : -323: Vietām viegls sniegs : Patchy light snow : -326: Viegls sniegs : Light snow : -329: Vietām vidējs sniegs : Patchy moderate snow : -332: Sniegs : Moderate snow : -335: Vietām stiprs sniegs : Patchy heavy snow : -338: Stiprs sniegs : Heavy snow : -350: Krusa : Ice pellets : -353: Viegla lietus duša : Light rain shower : -356: Mērena/Stipra lietus duša : Moderate or heavy rain shower : -359: Stipra lietus duša : Torrential rain shower : -362: Viegla un auksta lietus duša : Light sleet showers : -365: Viegls sniegs : Moderate or heavy sleet showers : -368: Viegla lietus duša ar sniegu : Light snow showers : -371: Mērena/Stipra lietus duša ar sniegu : Moderate or heavy snow showers : -386: Vietām viegls lietus ar pērkona negaisu : Patchy light rain with thunder : -389: Mērens/Stiprs lietus ar pērkona negaisu : Moderate or heavy rain with thunder : -392: Vietām viegls sniegs ar pērkona negaisu : Patchy light snow with thunder : -395: Mērens/Stiprs sniegs ar pērkona negaisu : Moderate or heavy snow with thunder : diff --git a/legacy/share/translations/mk.txt b/legacy/share/translations/mk.txt deleted file mode 100644 index 20f85a8..0000000 --- a/legacy/share/translations/mk.txt +++ /dev/null @@ -1,52 +0,0 @@ -113: Ведро: Clear -113: Сончево: Sunny -116: Делумно Облачно: Partly cloudy -119: Облачно: Cloudy -122: Облачно: Overcast -143: Слаба магла: Mist -176: Умерено врнежливо во близина: Patchy rain nearby -176: Умерено врнежливо можно: Patchy rain possible -179: Умерено снежливо можно: Patchy snow possible -182: Умерено можно: Patchy sleet possible -185: Умерено: Patchy freezing drizzle possible -200: Грмежи во близина: Thundery outbreaks in nearby -200: Грмежи можно: Thundery outbreaks possible -227: Снег: Blowing snow -230: Виулица: Blizzard -248: Магла: Fog -260: Смрзнувачка магла: Freezing fog -263: Умерен слаб дожд: Patchy light drizzle -266: Роса: Light drizzle -281: Смрзнувачка роса: Freezing drizzle -284: Тежка смрзнувачка роса: Heavy freezing drizzle -293: Умерен слаб дожд: Patchy light rain -296: Слаб дожд: Light rain -299: Умерен дожд понекогаш: Moderate rain at times -302: Умерен дожд: Moderate rain -305: Пороен дожд: Heavy rain at times -308: Пороен дожд : Heavy rain -311: Смрзнувачки дожд: Light freezing rain -314: Умерен или тешки врнежи со дожд: Moderate or heavy freezing rain -317: Дожд со лед: Light sleet -320: Умерен или тежок дожд со лед: Moderate or heavy sleet -323: Умерени врнежи на слаб снег: Patchy light snow -326: Слабо врнежи снег: Light snow -329: Умерени врнежи на снег: Patchy moderate snow -332: Умерен врнежи на снег: Moderate snow -335: Умерено тешки врнежи на снег: Patchy heavy snow -338: Тешки врнежи со снег: Heavy snow -350: Град: Ice pellets -353: Слаби врнежи: Light rain shower -356: Умерени или тешки врнежи: Moderate or heavy rain shower -359: Пороен дожд: Torrential rain shower -362: Слаби дождови: Light sleet showers -365: Умерено или тешки : Moderate or heavy sleet showers -368: Слаби врнежи снег: Light snow showers -371: Умерено или тежки врнежи со снег: Moderate or heavy snow showers -386: Умерено слаб дожд во области со грмежи: Patchy light rain in area with thunder -386: Умерено слаб дожд со грмежи: Patchy light rain with thunder -389: Умерен или тешки врнежи во области со грмежи: Moderate or heavy rain in area with thunder -389: Умерен или тешки врнежи со грмежи: Moderate or heavy rain with thunder -392: Умерено слаб снег со грмежи: Patchy light snow with thunder -395: Умерен или тешки врнежи снег во области со грмежи: Moderate or heavy snow in area with thunder -395: Умерен или тешки врнежи снег со грмежи: Moderate or heavy snow with thunder diff --git a/legacy/share/translations/nb-help.txt b/legacy/share/translations/nb-help.txt deleted file mode 100644 index 9b3acdd..0000000 --- a/legacy/share/translations/nb-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Bruk: - - $ curl wttr.in # nåværende lokasjon - $ curl wttr.in/osl # været på Gardermoen flyplass - -Støttede lokasjonsspesifiseringer: - - /oslo # bynavn - /~Ullevål+stadion # valgfri lokasjon - /Москва # Unicode navn på lokasjon på alle språk - /osl # flyplasskode (3 bokstaver) - /@stackoverflow.com # domenenavn - /94107 # postnummer (bare USA) - /-78.46,106.79 # GPS-koordinater - -Spesielle lokasjoner: - - /moon # Månefase (legg til ,+US eller ,+France disse byene) - /moon@2016-10-25 # Månefase for spesifisert dato (@2016-10-25) - -Enheter: - - ?m # metrisk (SI) (standard alle steder unntatt USA) - ?u # USCS (standard i USA) - ?M # vindstyrke i meter per sekund - -Visningsvalg: - - ?0 # kun været nå - ?1 # været nå + 1 dag - ?2 # været nå + 2 dager - ?n # smal visning (bare dag og natt) - ?q # stille visning (ingen "Værmelding"-tekst) - ?Q # superstille visning (ingen "Værmelding", ingen bynavn) - ?T # ingen terminalsekvenser (ingen farger) - -PNG valg: - - /paris.png # generer en PNG-fil - ?p # legg til ramme - ?t # gjennomsiktighet 150 - transparency=... # gjennomsiktighet fra 0 til 255 (255 = ikke gjennomsiktig) - -Tilvalg kan kombineres: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # for PNG er filmodus spesifisert etter _ - /Rome_0pq_lang=it.png # lange tilvalg separeres med understrek - -Oversettelser: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Støttede språk: - - FULL_TRANSLATION (støttet) - PARTIAL_TRANSLATION (under arbeid) - -Spesielle URLer: - - /:help # vis denne siden - /:bash.function # vis den foreslåtte bash-funksjonen wttr() - /:translation # vis informasjon om oversetterne diff --git a/legacy/share/translations/nb.txt b/legacy/share/translations/nb.txt deleted file mode 100644 index f11b2b9..0000000 --- a/legacy/share/translations/nb.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Klart : Clear -113: Sol : Sunny -116: Delvis skyet : Partly cloudy -119: Skyet : Cloudy -122: Overskyet : Overcast -143: Dis : Mist -176: Sjanser for skiftende regn : Patchy rain possible -179: Sjanser for skiftende snø : Patchy snow possible -182: Sjanser for skiftende sludd : Patchy sleet possible -185: Sjanser for skiftende, kaldt duskregn : Patchy freezing drizzle possible -200: Fare for torden : Thundery outbreaks possible -227: Snøfokk : Blowing snow -230: Snøstorm : Blizzard -248: Tåke : Fog -260: Kald tåke : Freezing fog -263: Skiftende, lett duskregn : Patchy light drizzle -266: Lett duskregn : Light drizzle -281: Kaldt duskregn : Freezing drizzle -284: Kraftig, kaldt duskregn : Heavy freezing drizzle -293: Skiftende, lett regn : Patchy light rain -296: Lett regn : Light rain -299: Til tider noe regn : Moderate rain at times -302: Noe regn : Moderate rain -305: Til tider kraftig regn : Heavy rain at times -308: Kraftig regn : Heavy rain -311: Lett, kaldt regn : Light freezing rain -314: Moderat eller kraftig kaldt regn : Moderate or heavy freezing rain -317: Lett sludd : Light sleet -320: Moderat eller kraftig sludd : Moderate or heavy sleet -323: Skiftende, lett snø : Patchy light snow -326: Lett snø : Light snow -329: Skiftende, moderat snø : Patchy moderate snow -332: Noe snø : Moderate snow -335: Skiftende, kraftig snøfall : Patchy heavy snow -338: Kraftig snøfall : Heavy snow -350: Hagl : Ice pellets -353: Lett regnskur : Light rain shower -356: Moderat eller tung regnskur : Moderate or heavy rain shower -359: Styrtregn : Torrential rain shower -362: Lette sluddbyger : Light sleet showers -365: Moderate eller tunge sluddbyger : Moderate or heavy sleet showers -368: Lette snøbyger : Light snow showers -371: Moderate eller kraftige snøbyger : Moderate or heavy snow showers -386: Skiftende, lett regn med torden : Patchy light rain with thunder -389: Moderat eller krafit regn med torden : Moderate or heavy rain with thunder -392: Skiftende, lett snø med torden : Patchy light snow with thunder -395: Moderat eller krafitg snø med torden : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/nl-help.txt b/legacy/share/translations/nl-help.txt deleted file mode 100644 index 012bb19..0000000 --- a/legacy/share/translations/nl-help.txt +++ /dev/null @@ -1,60 +0,0 @@ -Gebruik: - - $ curl wttr.in # huidige locatie - $ curl wttr.in/muc # het weer in Munic's vliegveld - -Ondersteunde locatie soorten: - - /paris # stadsnaam - /~Eiffel+tower # elke locatie - /Москва # Unicode naam van elke locatie in elke taal - /muc # vliegveld codes (3 letters) - /@stackoverflow.com # domeinnaam - /94107 # gebieds code - /-78.46,106.76 # GPS coördinaten - -Specialen locaties: - - /moon # Maanstand (voeg ,+US or ,+France voor deze plekken) - /moon@2016-10-25 # Maanstand op deze datum (@2016-10-25) - -Eenheden: - - ?m # metriek (SI) (gebruikt als standaard overal behalve US) - ?u # USCS (standaard in US) - ?M # laat wind snelheid in m/s zien - -Beeld opties: - - ?0 # alleen huidig weer - ?1 # huidig weer + 1 dag - ?2 # huidig weer + 2 dag - ?n # smalle versie (alleen dag en nacht) - ?q # stille versie (geen "Weerbericht" tekst) - ?Q # superstille versie (geen " Weerbericht", geen stadsnaam) - ?T # wissel terminal volgorde off (geen kleur) - -PNG opties: - - /paris.png # genereerd een PNG bestand - ?p # voegt een frame rond de output - ?t # transparantie 150 - transparency=... # transparantie van 0 to 255 (255 is niet doorzichtig) - -Lokalisatie: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Ondersteunde talen: - - de fr id it nb ru (ondersteund) - ar az be bg bs ca cy cs da el eo es et fi hi hr hu hy is ja jv ka kk ko ky lt lv mk ml nl nn pt pl ro sk sl sr sr-lat sv sw th tr uk uz vi zh zu he (mee bezig) - -Speciale URLs: - - /:help # laat help pagina zien - /:bash.function # laat voorgestelde wttr() functie zien voor in bash - /:translation # laat the informatie van de vertalers zien - diff --git a/legacy/share/translations/nl.txt b/legacy/share/translations/nl.txt deleted file mode 100644 index 4509a54..0000000 --- a/legacy/share/translations/nl.txt +++ /dev/null @@ -1,48 +0,0 @@ -113: Helder : Clear -113: Zonnig : Sunny -116: Deels bewolkt : Partly cloudy -119: Bewolkt : Cloudy -122: Bewolkt : Overcast -143: Mist : Mist -176: Mogelijk plaatselijk regen : Patchy rain possible -179: Mogelijk plaatselijk sneeuw : Patchy snow possible -182: Mogelijk plaatselijk hagel : Patchy sleet possible -185: Mogelijk plaatselijk ijzel : Patchy freezing drizzle possible -200: Mogelijk een onweersbui : Thundery outbreaks possible -227: Sneeuw winden : Blowing snow -230: Sneeuwstorm : Blizzard -248: Mist : Fog -260: Rijp : Freezing fog -263: Plaatselijk motregen : Patchy light drizzle -266: Motregen : Light drizzle -281: Ijzel : Freezing drizzle -284: Zware ijzel : Heavy freezing drizzle -293: Plaatselijk lichte regen : Patchy light rain -296: Lichte regen : Light rain -299: Af en toe regen : Moderate rain at times -302: Regen : Moderate rain -305: Af en toe zware regen : Heavy rain at times -308: Zware regen : Heavy rain -311: Lichte ijzel : Light freezing rain -314: Zware ijzel : Moderate or heavy freezing rain -317: Lichte hagel : Light sleet -320: Zware hagel : Moderate or heavy sleet -323: Plaatselijk lichte sneeuw : Patchy light snow -326: Lichte sneeuw : Light snow -329: Plaatselijke sneeuw : Patchy moderate snow -332: Sneeuw : Moderate snow -335: Plaatselijk zware sneeuw : Patchy heavy snow -338: Zware sneeuw : Heavy snow -350: Hagel : Ice pellets -353: Lichte regenbuien : Light rain shower -356: Regenbuien : Moderate or heavy rain shower -359: Extreem zware regenbuien : Torrential rain shower -362: Lichte hagelbuien : Light sleet showers -365: Hagelbuien : Moderate or heavy sleet showers -368: Lichte sneeuwbuien : Light snow showers -371: Sneeuwbuien : Moderate or heavy snow showers -386: Plaatselijk lichte regen met on: Patchy light rain with thunder weer -389: Regen met onweer : Moderate or heavy rain with thunder -392: Plaatselijk lichte sneeuw met o: Patchy light snow with thunder nweer -395: Sneeuw met onweer : Moderate or heavy snow with thunder - diff --git a/legacy/share/translations/nn.txt b/legacy/share/translations/nn.txt deleted file mode 100644 index 2af7ba9..0000000 --- a/legacy/share/translations/nn.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Klart : Clear -113: Sol : Sunny -116: Til dels skya : Partly cloudy -119: Skya : Cloudy -122: Overskya : Overcast -143: Dis : Mist -176: Sjansar for skiftande regn : Patchy rain possible -179: Sjansar for skiftande snø : Patchy snow possible -182: Sjansar for skiftande sludd : Patchy sleet possible -185: Sjansar for skiftande, kald duskregn : Patchy freezing drizzle possible -200: Sjansar for tore : Thundery outbreaks possible -227: Snøfokk : Blowing snow -230: Snøstorm : Blizzard -248: Tåke : Fog -260: Kald tåke : Freezing fog -263: Skiftande, lett duskregn : Patchy light drizzle -266: Lett duskregn : Light drizzle -281: Kald duskregn : Freezing drizzle -284: Tung, kald duskregn : Heavy freezing drizzle -293: Skiftande, lett regn : Patchy light rain -296: Lett regn : Light rain -299: Til tider noko regn : Moderate rain at times -302: Noko regn : Moderate rain -305: Til tider tung regn : Heavy rain at times -308: Tung regn : Heavy rain -311: Lett. kald regn : Light freezing rain -314: Moderat eller tung, kald regn : Moderate or heavy freezing rain -317: Lett sludd : Light sleet -320: Moderat eller tung sludd : Moderate or heavy sleet -323: Skiftande, lett snø : Patchy light snow -326: Lett snø : Light snow -329: Skiftande, moderat snø : Patchy moderate snow -332: Noko snø : Moderate snow -335: Skiftande, kraftige snøfall : Patchy heavy snow -338: Kraftige snøfall : Heavy snow -350: Hagl : Ice pellets -353: Lett regnskur : Light rain shower -356: Moderat eller tung regnskur : Moderate or heavy rain shower -359: Styrtregn : Torrential rain shower -362: Lette sluddbyger : Light sleet showers -365: Moderate eller tunge sluddbyger : Moderate or heavy sleet showers -368: Lette snøbyger : Light snow showers -371: Moderate eller tunge snøbyger : Moderate or heavy snow showers -386: Skiftande, lett regn med tore : Patchy light rain with thunder -389: Moderat eller tung regn med tore : Moderate or heavy rain with thunder -392: Skiftande, lett snø med tore : Patchy light snow with thunder -395: Moderat eller tung snø med tore : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/oc-help.txt b/legacy/share/translations/oc-help.txt deleted file mode 100644 index 9135d31..0000000 --- a/legacy/share/translations/oc-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Usatge: - - $ curl wttr.in # emplaçament actual - $ curl wttr.in/cdg # metèo a l'aeropòrt de Paris - Charles de Gaulle - -Types d'emplacements acceptés: - - /toulouse # nom de la vila - /~Eiffel+tower # emplaçament qual que siá - /Москва # nom Unicode o emplaçament qual que siá dins quala que siá lenga - /muc # còde aeropòrt (3 letras) - /@stackoverflow.com # nom de domeni - /94107 # còde postal (sonque pels Estats Units) - /-78.46,106.79 # coordenadas GPS - -Emplacements particuliers: - - /moon # passas de la luna (ajustar ,+US o ,+France per accedir a las vilas del meteis nom) - /moon@2016-10-25 # passas de la luna per aquesta data (@2016-10-25) - -Unitats: - - ?m # sistèma metric (per defaut pertot levat als Estats Units d d'America) - ?u # USCS (per defaut pels Estats-Units d'America) - ?M # afichar la velocitat del vent en m/s - -Opcion d'afichatge: - - ?0 # uèi solament - ?1 # uèi + deman - ?2 # uèi + 2 jorns - ?n # version corta (sonque pel jorn e la nuèch) - ?q # version silenciosa (cap d'entèsta "Previsions metèo per") - ?Q # version super-silencieuse (pas d'en-tête "Prévisions météo pour", pas de nom de la ville) - ?T # sequéncias d'ecapament pels terminals desactivadas (cap de colors) - -Opcions PNG: - - /paris.png # gnèra un fichièr PNG - ?p # ajuta un quadre altorn de la sortida - ?t # transparéncia 150 (transparence 150) - transparency=... # transparéncia de 0 fins a 255 (255 = cap de transparéncia) - -Combinar las opcions: - - /Toulouse?0pq - /Toulouse?0pq&lang=oc - /Toulouse_0pq.png # dins lo mòde PNG las opcions son especificadas après _ - /Rome_0pq_lang=it.png # las opcions longas son separadas per de underscores _ - -Localizacion: - - $ curl fr.wttr.in/Toulouse - $ curl wttr.in/toulouse?lang=oc - $ curl -H "Accept-Language: oc" wttr.in/toulouse - -Lengas suportadas: - - FULL_TRANSLATION (Support complèt) - PARTIAL_TRANSLATION (Support incomplèt) - -URLs particularas: - - /:help # mostra aquesta pagina - /:bash.function # foncion bash recomandada wttr() - /:translation # mostra las informacions sus la traduccion de wttr.in diff --git a/legacy/share/translations/oc.txt b/legacy/share/translations/oc.txt deleted file mode 100644 index 1e37bb0..0000000 --- a/legacy/share/translations/oc.txt +++ /dev/null @@ -1,50 +0,0 @@ -: Pluèja : Rain -: Plugeta, Raissas : Light Rain, Rain Shower -: Raissas : Rain Shower -113 : Temps clar : Clear -113 : Solelh : Sunny -116 : Nivolós en partida : Partly cloudy -119 : Nivolós : Cloudy -122 : Ennivolat : Overcast -143 : Brumós : Mist -176 : Possiblas raissas esparpalhadas : Patchy rain possible -179 : Possiblas nevadas esparpalhadas : Patchy snow possible -182 : Possiblas nèus fondudas esparpalhadas : Patchy sleet possible -185 : Possiblas plovinas gelibrantas esparpalhadas : Patchy freezing drizzle possible -200 : Auratges possibles : Thundery outbreaks possible -227 : Nèu e vent : Blowing snow -230 : Blisard : Blizzard -248 : Fums : Fog -260 : Nèbla gelibranta : Freezing fog -263 : Plovina leugièra esparpalhada : Patchy light drizzle -266 : Plovina leugièra : Light drizzle -281 : Plovina gelibranta : Freezing drizzle -284 : Fòrta plovina gelibranta : Heavy freezing drizzle -293 : Plugeta fina : Patchy light rain -296 : Plovina : Light rain -299 : Pluèja moderada intermitenta : Moderate rain at times -302 : Pluèja moderada : Moderate rain -305 : Forte pluie intermittente : Heavy rain at times -308 : Raissa : Heavy rain -311 : Pluie verglaçante légère : Light freezing rain -314 : Pluie verglaçante modérée à forte : Moderate or heavy freezing rain -317 : Aiganèu leugièra : Light sleet -320 : Aiganèu moderada o fòrta : Moderate or heavy sleet -323 : Nevada esparpalhada e leugièra : Patchy light snow -326 : Nevada leugièra : Light snow -329 : Nevada esparpalhada parciala : Patchy moderate snow -332 : Nevada moderada : Moderate snow -335 : Nevada fòrta parciala : Patchy heavy snow -338 : Nevada fòrta : Heavy snow -350 : Pèiras de glaça : Ice pellets -353 : Pluèja leugièra : Light rain shower -356 : Pluèja moderada a fòrta : Moderate or heavy rain shower -359 : Pluèja torrenciala : Torrential rain shower -362 : Granissa leugièra : Light sleet showers -365 : Granissa moderada a fòrta : Moderate or heavy sleet showers -368 : Nevadas leugièra : Light snow showers -371 : Granissa moderada a violenta : Moderate or heavy snow showers -386 : Pluèja auratjosa leugièra esparpalhada : Patchy light rain with thunder -389 : Pluèja auratjosa moderada a violenta : Moderate or heavy rain with thunder -392 : Nevada auratjosa esparpalhada e leugièra : Patchy light snow with thunder -395 : Nevada auratjosa moderada a violenta : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/pl-help.txt b/legacy/share/translations/pl-help.txt deleted file mode 100644 index acd9ef8..0000000 --- a/legacy/share/translations/pl-help.txt +++ /dev/null @@ -1,66 +0,0 @@ -Użycie: - - $ curl wttr.in # aktualna lokalizacja - $ curl wttr.in/waw # wybrana lokalizacja (WAW - Lotnisko Okęcie) - -Opcje wyboru lokalizacji: - - /paris # miasto - /~Eiffel+tower # miejsce - /Москва # nazwa miasta w dowolnym języku (jako Unicode string) - /waw # kod lotniska IATA (3 znaki) - /@stackoverflow.com # domena - /94107 # kod obszaru (tylko w USA) - /-78.46,106.79 # współrzędne geograficzne - -Specjalne miejsca: - - /moon # faza księżyca (używając n.p. ,+US lub ,+France zostanie wyświetlona faza dla podanego miejsca) - /moon@2016-10-25 # faza księżyca danego dnia (@2016-10-25) - -Jednostki: - - ?m # system metryczny (SI) (standard poza USA) - ?u # USCS (standard w USA) - ?M # Prędkość wiatru w m/s - -Ustawienia wyświetlania: - - ?0 # Pokaż jedynie aktualną pogodę - ?1 # Pokaż pogodę na jutro - ?2 # Pokaż pogodę na pojutrze - ?n # Wersja kompaktowa (tylko noc i dzień) - ?q # Wersja okrojona (bez tekstu 'Pogoda w') - ?Q # Wersja bardziej okrojona (bez tekstu 'Pogoda w' i nazwy miasta) - ?T # Wersja jednokolorowa - -Opcje PNG: - - /paris.png # generuje plik PNG - ?p # dodaje obramowanie do obrazka - ?t # Przezroczystość 150 - transparency=... # Przezroczystość między 0 a 255 (255 = brak przezroczystości) - -Opcje mogą być ze sobą łączone: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # jeśli generujemy obrazek PNG, to te opcje podajemy po _ (znaku podkreślenia) - /Rome_0pq_lang=it.png # _ (znakiem podkreślenia) oddzielamy opcje od siebie - -Lokalizacja: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Obsługiwane języki: - - FULL_TRANSLATION (obsługiwane) - PARTIAL_TRANSLATION (w tłumaczeniu) - -Strony specjalne: - - /:help # wyświetla tę stronę - /:bash.function # wyświetla proponowaną funkcję `wttr()` dla powłoki bash - /:translation # wyświetla informacje o tłumaczach diff --git a/legacy/share/translations/pl.txt b/legacy/share/translations/pl.txt deleted file mode 100644 index c8a67d0..0000000 --- a/legacy/share/translations/pl.txt +++ /dev/null @@ -1,81 +0,0 @@ -113: Bezchmurnie : Clear -113: Słonecznie : Sunny -116: Lekkie zachmurzenie : Partly cloudy -119: Zachmurzenie : Cloudy -122: Całkowite zachmurzenie : Overcast -143: Zamglenie : Mist -176: Możliwe miejscowe opady deszczu : Patchy rain possible -179: Możliwe miejscowe opady śniegu : Patchy snow possible -182: Możliwe miejscowe opady deszczu ze śniegiem : Patchy sleet possible -185: Możliwe miejscowe opady marznącego deszczu : Patchy freezing drizzle possible -200: Możliwa burza : Thundery outbreaks possible -227: Zawieja śnieżna : Blowing snow -230: Śnieżyca : Blizzard -248: Mgła : Fog -260: Marznąca mgła : Freezing fog -263: Przelotna mżawka : Patchy light drizzle -266: Mżawka : Light drizzle -281: Marznąca mżawka : Freezing drizzle -284: Marznąca mżawka : Heavy freezing drizzle -293: Przelotne lekkie opady deszczu : Patchy light rain -296: Lekkie opady deszczu : Light rain -299: Przelotne umiarkowane opady deszczu : Moderate rain at times -302: Umiarkowane opady deszczu : Moderate rain -305: Przelotne silne opady deszczu : Heavy rain at times -308: Silne opady deszczu : Heavy rain -311: Lekki marznący deszcz : Light freezing rain -314: Umiarkowany lub silny marznący deszcz : Moderate or heavy freezing rain -317: Lekki deszcz ze śniegiem : Light sleet -320: Umiarkowany lub silny deszcz ze śniegiem : Moderate or heavy sleet -323: Miejscowe lekkie opady śniegu : Patchy light snow -326: Lekkie opady śniegu : Light snow -329: Miejscowe umiarkowane opady śniegu : Patchy moderate snow -332: Umiarkowane opady śniegu : Moderate snow -335: Miejscowe silne opady śniegu : Patchy heavy snow -338: Silne opady śniegu : Heavy snow -350: Gradobicie : Ice pellets -353: Lekkie opady deszczu : Light rain shower -356: Umiarkowane lub silne opady deszczu : Moderate or heavy rain shower -359: Oberwanie chmury : Torrential rain shower -362: Lekki deszcz ze śniegiem : Light sleet showers -365: Umiarkowany lub silny deszcz ze śniegiem : Moderate or heavy sleet showers -368: Lekkie opady śniegu : Light snow showers -371: Umiarkowane lub silne opady śniegu : Moderate or heavy snow showers -386: Miejscowe lekkie opady deszczu i burza z piorunami : Patchy light rain with thunder -389: Umiarkowane lub silne opady deszczu i burza z piorunami : Moderate or heavy rain with thunder -392: Miejscowe lekkie opady śniegu i burza z piorunami : Patchy light snow with thunder -395: Umiarkowane lub silne opady śniegu i burza z piorunami : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/pt-br-help.txt b/legacy/share/translations/pt-br-help.txt deleted file mode 100644 index d096721..0000000 --- a/legacy/share/translations/pt-br-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Instruções: - - $ curl wttr.in # o tempo na sua localização atual - $ curl wttr.in/muc # o tempo no aeroporto de Munique - -Tipos de localização suportados: - - /paris # o nome de uma cidade - /~Eiffel+tower # o nome de qualquer lugar famoso - /Москва # nome Unicode de qualquer lugar em qualquer idioma - /muc # o código de um aeroporto (3 letras) - /@stackoverflow.com # o nome de um domínio web - /94107 # um código de área - /-78.46,106.79 # coordenadas do GPS - -Lugares especiais: - - /moon # A fase da lua (crescente ,+US ou ,+France para estas cidades) - /moon@2016-10-25 # A fase da lua em uma determinada data (@2016-10-25) - -Unidades: - - ?m # métricas (SI) (o padrão em todos os lugares exceto nos EUA) - ?u # Sistema Unificado de Clasificaçāo de Solo ou USCS (o padrão nos EUA) - ?M # mostrar a velocidade do vento em m/s - -Opçōes de visualização: - - ?0 # somente o clima atual - ?1 # o clima atual + a previsão de 1 dia - ?2 # o clima atual + a previsão de 2 dias - ?n # versão curta (só o dia e a noite) - ?q # versão quieta (sem o texto de "Previsão do Tempo") - ?Q # versão superquieta (sem "Previsão do Tempo" e o nome da cidade) - ?T # desliga as sequências de terminal (sem cores) - -Opçōes de PNG: - - /paris.png # gera uma imagem PNG - ?p # acrescenta uma borda ao redor da imagem - ?t # transparência 150 - transparency=... # transparência de 0 a 255 (255 = sem transparência) - -As opções podem ser usadas em conjunto: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # em PNG as opções se especificam depois do caracter _ - /Rome_0pq_lang=it.png # uma longa sequência de opções podem ser separadas pelo caracter _ - -Localizaçāo: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Línguas suportadas: - - FULL_TRANSLATION (suportadas) - PARTIAL_TRANSLATION (em andamento) - -URLs especiais: - - /:help # mostra esta página - /:bash.function # sugere uma função wttr() em bash - /:translation # mostra informação a respeito dos tradutores - diff --git a/legacy/share/translations/pt-br.txt b/legacy/share/translations/pt-br.txt deleted file mode 100644 index a43ffe1..0000000 --- a/legacy/share/translations/pt-br.txt +++ /dev/null @@ -1,81 +0,0 @@ -113: Limpo : Clear -113: Ensolarado : Sunny -116: Parcialmente encoberto : Partly cloudy -119: Encoberto : Cloudy -122: Nublado : Overcast -143: Névoa : Mist -176: Possibilidade chuva fraca : Patchy rain possible -179: Possibilidade neve fraca : Patchy snow possible -182: Possibilidade granizo : Patchy sleet possible -185: Possibilidade chuvisco gelado : Patchy freezing drizzle possible -200: Possibilidade de pancadas de chuva : Thundery outbreaks possible -227: Neve com vento : Blowing snow -230: Nevasca : Blizzard -248: Nevoeiro : Fog -260: Névoa congelante : Freezing fog -263: Chuvisco irregualr : Patchy light drizzle -266: Chuvisco : Light drizzle -281: Chuvisco gelado : Freezing drizzle -284: Chuvisco muito gelado : Heavy freezing drizzle -293: Garoa irregular : Patchy light rain -296: Garoa : Light rain -299: Chuva moderada ocasional : Moderate rain at times -302: Chuva moderada : Moderate rain -305: Chuva forte ocasional : Heavy rain at times -308: Chuva forte : Heavy rain -311: Garoa gelada : Light freezing rain -314: Chuva forte ou moderada gelada : Moderate or heavy freezing rain -317: Granizo fraco : Light sleet -320: Granizo moderado ou forte : Moderate or heavy sleet -323: Neve fraca irregular : Patchy light snow -326: Neve fraca : Light snow -329: Neve moderada irregular : Patchy moderate snow -332: Neve moderada : Moderate snow -335: Neve forte irregular : Patchy heavy snow -338: Neve forte : Heavy snow -350: Pelotas de gelo : Ice pellets -353: Chuveiro de garoa : Light rain shower -356: Chuveiro de chuva moderada ou forte : Moderate or heavy rain shower -359: Chuveiro de chuva torrencial : Torrential rain shower -362: Chuveiro de granizo fraco : Light sleet showers -365: Chuveiro de granizo moderada ou forte : Moderate or heavy sleet showers -368: Chuveiro de neve fraca : Light snow showers -371: Chuveiro de neve moderada ou forte : Moderate or heavy snow showers -386: Tempestate com garoa irregular : Patchy light rain with thunder -389: Tempestade com chuva moderada ou forte : Moderate or heavy rain with thunder -392: Tempestade com neve fraca : Patchy light snow with thunder -395: Tempestade com neve moderada ou forte : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/pt-help.txt b/legacy/share/translations/pt-help.txt deleted file mode 100644 index dc3e5c7..0000000 --- a/legacy/share/translations/pt-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Instruções: - - $ curl wttr.in # o clima na sua localização atual - $ curl wttr.in/muc # o clima no aeroporto de Munique - -Tipos de localização suportados: - - /paris # o nome de uma cidade - /~Eiffel+tower # o nome de qualquer lugar famoso - /Москва # nome Unicode de qualquer lugar em qualquer idioma - /muc # o código de um aeroporto (3 letras) - /@stackoverflow.com # o nome de um domínio web - /94107 # um código de área - /-78.46,106.79 # coordenadas do GPS - -Lugares especiais: - - /moon # A fase da lua (acrescente ,+US ou ,+France para estas cidades) - /moon@2016-10-25 # A fase da lua em uma data determinada (@2016-10-25) - -Unidades: - - ?m # métricas (SI) (o padrão em todos os lugares exceto nos EUA) - ?u # Sistema Unificado de Clasificaçāo de Solo ou USCS (o padrão nos EUA) - ?M # mostrar a velocidade do vento em m/s - -Opçōes de visualização: - - ?0 # somente o clima atual - ?1 # o clima atual + a previsão de 1 dia - ?2 # o clima atual + a previsão de 2 dias - ?n # versão curta (só o dia e a noite) - ?q # versão quieta (sem o texto de "Previsão do Tempo") - ?Q # versão superquieta (sem "Previsão do Tempo" e o nome da cidade) - ?T # desliga as sequências de terminal (sem cores) - -Opçōes de PNG: - - /paris.png # gera uma imagem PNG - ?p # acrescenta uma borda ao redor da imagem - ?t # transparência 150 - transparency=... # transparência de 0 a 255 (255 = sem transparência) - -As opções podem ser usadas em conjunto: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # em PNG as opções se especificam depois do caracter _ - /Rome_0pq_lang=it.png # uma longa sequência de opções podem ser separadas pelo caracter _ - -Localizaçāo: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Línguas suportadas: - - FULL_TRANSLATION (suportadas) - PARTIAL_TRANSLATION (em andamento) - -URLs especiais: - - /:help # mostra esta página - /:bash.function # sugere uma função wttr() em bash - /:translation # mostra informação a respeito dos tradutores - diff --git a/legacy/share/translations/ro-help.txt b/legacy/share/translations/ro-help.txt deleted file mode 100644 index 5b7c162..0000000 --- a/legacy/share/translations/ro-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Utilizare: - - $ curl wttr.in # localizare curentă - $ curl wttr.in/otp # Aeroportul Internațional Henri Coandă (OTP) - -Tipuri de localizări acceptate: - - /Cluj # numele localității - /~coloana+infinitului # locuri binecunoscute sau puncte de interes - /Москва # nume Unicode în orice limbă - /otp # cod aeroport (3 litere) - /@stackoverflow.com # nume de domeniu - /94107 # cod poștal (doar pentru Statele Unite) - /-78.46,106.79 # coordonate GPS - -Localizări speciale: - - /moon # faza lunii (adăugați ,+US sau ,+France pentru a arăta orașele cu acest nume) - /moon@2016-10-25 # faza lunii într-o anumită dată (@2016-10-25) - -Unități de măsură: - - ?m # sistem metric (implicit, mai puțin pentru Statele Unite ale Americii) - ?u # USCS (implicit pentru Statele Unite ale Americii) - ?M # afișează viteza vântului în m/s - -Opțiuni de afișare: - - ?0 # azi - ?1 # azi și mâine - ?2 # azi, mâine și poimâine - ?n # doar ziua și noaptea - ?q # fără antet "Prognoza meteo pentru" - ?Q # fără antet "Prognoza meteo pentru", fără numele localității - ?T # fără coduri speciale în terminal (fără culori) - -Opțiuni PNG: - - /Băicoi.png # generează un fișier PNG - ?p # cu chenar - ?t # cu transparență 150 - transparency=... # cu transparență în intervalul [0-255] (255 = fără transparență) - -Combinarea opțiunilor: - - /Lehliu-Gară?0q - /Vaslui?0q&lang=ro - /Videle_0pq.png # în modul PNG opțiunile se specifică după _ - /Roma_0pq_lang=it.png # opțiunile cu nume lung se separă prin _ - -Limba de afișare: - - $ curl ro.wttr.in/Tărtășești - $ curl wttr.in/Paris?lang=fr - $ curl -H "Accept-Language: de" wttr.in/berlin - -Limbi suportate: - - FULL_TRANSLATION (Suport complet) - PARTIAL_TRANSLATION (Suport incomplet) - -URL-uri speciale: - - /:help # afișează această pagină - /:bash.function # funcție bash wttr() - /:translation # afișează informații despre traducerile din wttr.in - diff --git a/legacy/share/translations/ro.txt b/legacy/share/translations/ro.txt deleted file mode 100644 index 50a070b..0000000 --- a/legacy/share/translations/ro.txt +++ /dev/null @@ -1,82 +0,0 @@ -113: Senin : Clear -113: Însorit : Sunny -116: Parțial înnorat : Partly cloudy -119: Înnorat : Cloudy -122: Cer acoperit : Overcast -143: Ceață : Mist -176: Posibilă ploaie pe alocuri : Patchy rain possible -179: Posibilă ninsoare pe alocuri : Patchy snow possible -182: Posibilă lapoviță pe alocuri : Patchy sleet possible -185: Posibilă burniță înghețată pe alocuri : Patchy freezing drizzle possible -200: Posibile tunete : Thundery outbreaks possible -227: Zăpadă în rafale : Blowing snow -230: Viscol : Blizzard -248: Ceață : Fog -260: Ceață înghețată : Freezing fog -263: Burniță ușoară pe alocuri : Patchy light drizzle -266: Burniță ușoară : Light drizzle -281: Burniță înghețată : Freezing drizzle -284: Burnită înghețată abundentă : Heavy freezing drizzle -293: Ploaie ușoară pe alocuri : Patchy light rain -296: Ploaie ușoară : Light rain -299: Momente de ploaie moderată : Moderate rain at times -302: Ploaie moderată : Moderate rain -305: Momente de ploaie torențială : Heavy rain at times -308: Ploaie torențială : Heavy rain -311: Ploaie înghețată ușoară : Light freezing rain -314: Ploaie înghețată moderată sau torențială : Moderate or heavy freezing rain -317: Lapoviță ușoară : Light sleet -320: Lapoviță moderată sau torențială : Moderate or heavy sleet -323: Ninsoare ușoară pe alocuri : Patchy light snow -326: Ninsoare ușoară : Light snow -329: Ninsoare moderată pe alocuri : Patchy moderate snow -332: Ninsoare moderată : Moderate snow -335: Ninsoare abundentă pe alocuri : Patchy heavy snow -338: Ninsoare abundentă : Heavy snow -350: Grindină : Ice pellets -353: Averse de ploaie ușoară : Light rain shower -356: Averse de ploaie moderată sau torențială : Moderate or heavy rain shower -359: Averse de ploaie torențială : Torrential rain shower -362: Averse de lapoviță ușoară : Light sleet showers -365: Averse de lapoviță moderată sau torențială : Moderate or heavy sleet showers -368: Averse de ninsoare ușoară : Light snow showers -371: Averse de ninsoare moderată sau torențială : Moderate or heavy snow showers -386: Ploi ușoare cu tunete pe alocuri : Patchy light rain with thunder -389: Ploaie moderată sau furtună cu tunete : Moderate or heavy rain with thunder -392: Ninsoare ușoară cu tunete pe alocuri : Patchy light snow with thunder -395: Ninsoare moderată sau abundentă cu tunete : Moderate or heavy snow with thunder - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/ru-help.txt b/legacy/share/translations/ru-help.txt deleted file mode 100644 index 2e28a61..0000000 --- a/legacy/share/translations/ru-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Использование: - - $ curl wttr.in # текущее местоположение - $ curl wttr.in/svo # погода в аэропорту Шереметьево (код ICAO: SVO) - -Поддерживаемые типы местоположений: - - /paris # город - /~Eiffel+tower # любое местоположение - /Москва # юникодное имя любого местоположения на любом языке - /muc # код аэропорта ICAO (3 буквы) - /@stackoverflow.com # доменное имя - /94107 # почтовый индекс (только для США) - /-78.46,106.79 # GPS-координаты - -Специальные условные местоположения: - - /moon # Фаза Луны (добавьте ,+US или ,+France для города Moon в США/Франции) - /moon@2016-10-25 # Фаза Луны для указанной даты (@2016-10-25) - -Единицы измерений: - - ?m # метрические (СИ) (используются везде кроме США) - ?u # USCS (используются в США) - ?M # показывать скорость ветра в м/с - -Опции отображения: - - ?0 # только текущая погода - ?1 # погода сегодня + 1 день - ?2 # погода сегодня + 2 дня - ?n # узкая версия (только день и ночь) - ?q # тихая версия (без текста "Прогноз погоды") - ?Q # сверхтихая версия (без "Прогноз погоды", нет названия города) - ?T # отключить терминальные последовательности (без цветов) - -PNG-опции: - - /paris.png # сгенерировать PNG-файл - ?p # добавить рамочку вокруг - ?t # transparency=150 (прозрачность 150) - transparency=... # прозрачность от 0 до 255 (255 = не прозрачный) - -Опции можно комбинировать: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # в PNG-запросах опции указываются после _ - /Rome_0pq_lang=it.png # длинные опции разделяются знаком подчёркивания _ - -Локализация: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Поддерживаемые языки: - - FULL_TRANSLATION (поддерживаются) - PARTIAL_TRANSLATION (в процессе) - -Специальные страницы: - - /:help # показать эту страницу - /:bash.function # показать рекомендованную функцию wttr() - /:translation # показать список переводчиков wttr.in - diff --git a/legacy/share/translations/ru.txt b/legacy/share/translations/ru.txt deleted file mode 100644 index a0cb592..0000000 --- a/legacy/share/translations/ru.txt +++ /dev/null @@ -1,48 +0,0 @@ - : Проливной дождь : Rain shower : -113: Ясно : Clear : -113: Солнечно : Sunny : -116: Переменная облачность : Partly cloudy : -119: Облачно : Cloudy : -122: Пасмурно : Overcast : -143: Дымка : Mist : -176: Местами дождь : Patchy rain possible : -179: Местами снег : Patchy snow possible : -182: Местами дождь со снегом : Patchy sleet possible : -185: Местами замерзающая морось : Patchy freezing drizzle possible : -200: Местами грозы : Thundery outbreaks possible : -227: Поземок : Blowing snow : -230: Метель : Blizzard : -248: Туман : Fog : -260: Переохлажденный туман : Freezing fog : -263: Местами слабая морось : Patchy light drizzle : -266: Слабая морось : Light drizzle : -281: Замерзающая морось : Freezing drizzle : -284: Сильная замерзающая морось : Heavy freezing drizzle : -293: Местами небольшой дождь : Patchy light rain : -296: Небольшой дождь : Light rain : -299: Временами умеренный дождь : Moderate rain at times : -302: Умеренный дождь : Moderate rain : -305: Временами сильный дождь : Heavy rain at times : -308: Сильный дождь : Heavy rain : -311: Слабый переохлажденный дождь : Light freezing rain : -314: Умеренный или сильный переохлажденный дождь : Moderate or heavy freezing rain : -317: Небольшой дождь со снегом : Light sleet : -320: Умеренный или сильный дождь со снегом : Moderate or heavy sleet : -323: Местами небольшой снег : Patchy light snow : -326: Небольшой снег : Light snow : -329: Местами умеренный снег : Patchy moderate snow : -332: Умеренный снег : Moderate snow : -335: Местами сильный снег : Patchy heavy snow : -338: Сильный снег : Heavy snow : -350: Ледяной дождь : Ice pellets : -353: Небольшой ливневый дождь : Light rain shower : -356: Умеренный или сильный ливневый дождь : Moderate or heavy rain shower : -359: Очень сильный ливень : Torrential rain shower : -362: Небольшой ливневый дождь со снегом : Light sleet showers : -365: Небольшой снег : Moderate or heavy sleet showers : -368: Небольшой ливневый дождь со снегом : Light snow showers : -371: Умеренный или сильный снежный ливень : Moderate or heavy snow showers : -386: Местами небольшой дождь с грозой : Patchy light rain with thunder : -389: Умеренный или сильный дождь с грозой : Moderate or heavy rain with thunder : -392: Местами небольшой снег с грозой : Patchy light snow with thunder : -395: Умеренный или сильный снег с грозой : Moderate or heavy snow with thunder : diff --git a/legacy/share/translations/sl.txt b/legacy/share/translations/sl.txt deleted file mode 100644 index b933504..0000000 --- a/legacy/share/translations/sl.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Jasno : Clear -113: Sončno : Sunny -116: Delno oblačno : Partly cloudy -119: Oblačno : Cloudy -122: Pretežno oblačno : Overcast -143: Megleno : Mist -176: Možne plohe : Patchy rain possible -179: Možno občasno sneženje : Patchy snow possible -182: Možen žled : Patchy sleet possible -185: Možna pomrznjena rosa : Patchy freezing drizzle possible -200: Možno neurje z grmenjem : Thundery outbreaks possible -227: Snežno neurje : Blowing snow -230: Snežno neurje : Blizzard -248: Megla : Fog -260: Zmrznjena megla : Freezing fog -263: Rahlo rosenje : Patchy light drizzle -266: Rahel dež : Light drizzle -281: Zmrznjeno rosenje : Freezing drizzle -284: Močno zmrznjeno rosenje : Heavy freezing drizzle -293: Občasno rahel dež : Patchy light rain -296: Rahel dež : Light rain -299: Občasno droben dež : Moderate rain at times -302: Droben dež : Moderate rain -305: Občasno močan dež : Heavy rain at times -308: Močan dež : Heavy rain -311: Rahel zmrznjen dež : Light freezing rain -314: Zmrznjen dež : Moderate or heavy freezing rain -317: Rahel žled : Light sleet -320: Žled : Moderate or heavy sleet -323: Občasno rahlo sneženje : Patchy light snow -326: Rahel sneg : Light snow -329: Občasno rahlo sneženje : Patchy moderate snow -332: Rahel sneg : Moderate snow -335: Občasno močan sneg : Patchy heavy snow -338: Močan sneg : Heavy snow -350: Led : Ice pellets -353: Rahla ploha : Light rain shower -356: Rahle ali močne plohe : Moderate or heavy rain shower -359: Hudourniški dež : Torrential rain shower -362: Rahel žled : Light sleet showers -365: Žled : Moderate or heavy sleet showers -368: Občasno rahlo sneženje : Light snow showers -371: Rahle ali močne snežne padavine : Moderate or heavy snow showers -386: Občasno rahel dež z grmenjem : Patchy light rain with thunder -389: Dež z grmenjem : Moderate or heavy rain with thunder -392: Občasen sneg z grmenjem : Patchy light snow with thunder -395: Sneg z grmenjem : Moderate or heavy snow with thunder \ No newline at end of file diff --git a/legacy/share/translations/te.txt b/legacy/share/translations/te.txt deleted file mode 100644 index 2addf85..0000000 --- a/legacy/share/translations/te.txt +++ /dev/null @@ -1,61 +0,0 @@ -113: : స్పష్టం -113: : ఎండ -116: : కొంత మేఘావృతం -119: : మేఘావృతం -122: : దట్టమైన మబ్బులు -143: : పొగమంచు -176: : మందమైన వర్షం సాధ్యమవుతుంది -179: : పదునైన మంచు సాధ్యం -182: : సాధ్యమయ్యే పదునైన దుప్పటి -185: : పదునైన ఘనీభవన చినుకులు సాధ్యం -200: : Thundery వ్యాప్తి సాధ్యం -227: : మంచు వెదజల్లు -230: : మంచు తుఫాను -248: : పొగమంచు -260: : చల్లటి పొగమంచు -263: : పదునైన తేలికపాటి చిల్లు -266: : కాంతి చినుకులు -281: : ఘనీభవన చినుకులు -284: : భారీ గడ్డకట్టే చినుకులు -293: : తేలికపాటి వర్షం -296: : తేలికపాటి వర్షం -299: : సమయాల్లో మితమైన వర్షం -302: : ఆధునిక వర్షం -305: : సమయాల్లో భారీ వర్షం -308: : భారీవర్షం -311: : కాంతి ఘనీభవన వర్షం -314: : ఆధునిక లేదా భారీ ఘనీభవన వర్షం -317: : కాంతి స్లేట్ -320: : ఆధునిక లేదా భారీ స్లీప్ -323: : పదునైన తేలికపాటి మంచు -326: : తేలికపాటి మంచు -329: : మందమైన మోస్తరు మంచు -332: : ఆధునిక మంచు -335: : మందమైన భారీ మంచు -338: : భారీ మంచు -350: : మంచు ముక్కలు -353: : తేలికపాటి వర్షం షవర్ -356: : ఆధునిక లేదా భారీ వర్షం షవర్ -359: : కుండపోత వర్షం షవర్ -362: : లైట్ స్లేట్ వర్షం -365: : మోడరేట్ లేదా భారీ షీట్ వర్షం -368: : తేలికపాటి మంచు వర్షం -371: : మితమైన లేదా భారీ మంచు వర్షం -386: : ఉరుములతో కూడిన తేలికపాటి వర్షం -389: : ఉరుములతో మితమైన లేదా భారీ వర్షం -392: : ఉరుములతో మందమైన తేలికపాటి మంచు -395: : ఉరుములతో మోస్తరు లేదా భారీ మంచు - - - - - - - - - - - - - - diff --git a/legacy/share/translations/th-help.txt b/legacy/share/translations/th-help.txt deleted file mode 100644 index 2e0dfb4..0000000 --- a/legacy/share/translations/th-help.txt +++ /dev/null @@ -1,69 +0,0 @@ -วิธีใช้: - - $ curl wttr.in # ตำแหน่งปัจจุบัน - $ curl wttr.in/muc # สภาพอากาศที่สนามบินมิวนิค - -รองรับสถานที่หลายรูปแบบ: - - /paris # ชื่อเมือง - /~Eiffel+tower # สถานที่ใดก็ได้ - /Москва # ชื่อ Unicode ของสถานที่และภาษาใดก็ได้ - /muc # รหัสสนามบิน (3 ตัวอักษร) - /@stackoverflow.com # โดเมนเนม - /94107 # รหัสพื้นที่ - /-78.46,106.79 # ตำแหน่ง GPS - -สถานที่พิเศษ: - - /moon # จันทรคติ (เพิ่ม ,+US หรือ ,+France สำหรับเมือง) - /moon@2016-10-25 # จันทรคติ สำหรับวันที่ (@2016-10-25) - -หน่วย: - - m # เมตริก (SI) (ใช้กับทุกที่ยกเว้นประเทศอเมริกา) - u # USCS (ใช้ในประเทศอเมริกา) - M # แสดงความเร็วลม เมตร/วินาที - -ดูตัวเลือก: - - 0 # เฉพาะสภาพอากาศปัจจุบัน - 1 # สภาพอากาศของวันพรุ่งนี้ - 2 # สภาพอากาศของวันมะรืน - A # ไม่สนใจ User-Agent และบังคับใช้ฟอร์แมต ANSI (terminal) - F # ไม่แสดงบรรทัดติดตาม - n # แสดงผลแบบแคบ (เฉพาะตอนเช้าและค่ำ) - q # แสดงผลแบบเงียบ (ไม่แสดงรายงานสภาพอากาศ) - Q # แสดงผลแบบเงียบที่สุด (ไม่แสดงรายงานสภาพอากาศและชื่อเมือง) - T # ปิดการทำงาน terminal sequences (ไม่มีสี) - -ตัวเลือก PNG: - - /paris.png # สร้างไฟล์ PNG - p # เพิ่มกรอบรอบๆไฟล์ที่สร้าง - t # โปร่งใส 150 - transparency=... # โปร่งใส จาก 0 ถึง 255 (255 = ไม่โปร่งใส) - -ตัวเลือกสามารถรวมกันได้: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # สำหรับการสร้าง PNG ให้เพิ่มตัวเลือกต่อท้าย _ - /Rome_0pq_lang=it.png # ตัวเลือกหลายตัวให้ต่อด้วย _ - -ตัวเลือกภาษา: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -ภาษาที่รองรับ: - - FULL_TRANSLATION (รองรับ) - PARTIAL_TRANSLATION (อยู่ระหว่างการแปล) - -URL พิเศษ: - - /:help # แสดงหน้านี้ - /:bash.function # แสดงคำแนะนำ bash function wttr() - /:translation # แสดงข้อมูลของผู้ร่วมแปล - diff --git a/legacy/share/translations/th.txt b/legacy/share/translations/th.txt deleted file mode 100644 index 8d7a6b2..0000000 --- a/legacy/share/translations/th.txt +++ /dev/null @@ -1,81 +0,0 @@ -113: ฟ้าโปร่ง : Clear : -113: แดดจัด : Sunny : -116: มีเมฆบางส่วน : Partly cloudy : -119: มีเมฆมาก : Cloudy : -122: มืดครึ้ม : Overcast : -143: มีหมอก : Mist : -176: มีโอกาสฝนตกเป็นหย่อม ๆ : Patchy rain possible : -179: มีโอกาสหิมะตกเป็นหย่อม ๆ : Patchy snow possible : -182: มีโอกาสลูกเห็บตกเป็นหย่อม ๆ : Patchy sleet possible : -185: มีโอกาสละอองฝนเยือกแข็งตกเป็นหย่อม ๆ : Patchy freezing drizzle possible : -200: มีโอกาสฟ้าผ่า : Thundery outbreaks possible : -227: หิมะพัดผ่าน : Blowing snow : -230: พายุหิมะ : Blizzard : -248: หมอก : Fog : -260: หมอกเยือกแข็ง : Freezing fog : -263: ละอองฝนเป็นหย่อม ๆ : Patchy light drizzle : -266: ฝนพรำ : Light drizzle : -281: ละอองฝนเยือกแข็ง : Freezing drizzle : -284: ละอองฝนเยือกแข็งอย่างหนัก : Heavy freezing drizzle : -293: ฝนตกเบาบางเป็นหย่อม ๆ : Patchy light rain : -296: ฝนตกเล็กน้อย : Light rain : -299: ฝนตกปานกลางในช่วงเวลานั้น : Moderate rain at times : -302: ฝนตกปานกลาง : Moderate rain : -305: ฝนตกหนักในช่วงเวลานั้น : Heavy rain at times : -308: ฝนตกหนัก : Heavy rain : -311: ฝนเยือกแข็งเบาบาง : Light freezing rain : -314: ฝนเยือกแข็งปานกลางหรือหนัก : Moderate or heavy freezing rain : -317: ลูกเห็บเบาบาง : Light sleet : -320: ลูกเห็บปานกลางหรือหนัก : Moderate or heavy sleet : -323: หิมะตกโปรยปรายเป็นหย่อม ๆ : Patchy light snow : -326: หิมะตกเบาบาง : Light snow : -329: หิมะตกปานกลางเป็นหย่อม ๆ : Patchy moderate snow : -332: หิมะตกปานกลาง : Moderate snow : -335: หิมะตกหนักเป็นหย่อม ๆ : Patchy heavy snow : -338: หิมะตกหนัก : Heavy snow : -350: มีเกล็ดน้ำแข็ง : Ice pellets : -353: ฝนตกโปรยปราย : Light rain shower : -356: ฝนตกปานกลางหรือหนัก : Moderate or heavy rain shower : -359: ฝนตกชุก : Torrential rain shower : -362: ลูกเห็บตกเบาบาง : Light sleet showers : -365: ลูกเห็บตกปานกลางหรือหนัก : Moderate or heavy sleet showers : -368: หิมะตกโปรยปราย : Light snow showers : -371: หิมะตกปานกลางหรือหนัก : Moderate or heavy snow showers : -386: ฝนตกและมีฟ้าผ่าเป็นหย่อม ๆ : Patchy light rain with thunder : -389: ฝนตกและมีฟ้าผ่าปานกลางหรือหนัก : Moderate or heavy rain with thunder : -392: หิมะตกและมีฟ้าผ่าเป็นหย่อม ๆ : Patchy light snow with thunder : -395: หิมะตกและมีฟ้าผ่าปานกลางหรือหนัก : Moderate or heavy snow with thunder : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/translations/tr-help.txt b/legacy/share/translations/tr-help.txt deleted file mode 100644 index 51d6232..0000000 --- a/legacy/share/translations/tr-help.txt +++ /dev/null @@ -1,68 +0,0 @@ -Komut Satırı Kullanımı: - - $ curl wttr.in # bulunduğunuz konum - $ curl wttr.in/esb # Esenboğa havalimanında hava durumu - -Desteklenen konum tipleri: - - /istanbul # şehir adı - /~Anıtkabir # herhangi bir konum - /Москва # Herhangi bir dilde herhangi bir unicode konum - /esb # havalimanı kodu (3 harfli) - /@stackoverflow.com # alan adı - /06800 # posta kodları - /39.925325,32.836987 # Yer belirleme sistemi(GPS) koordinatları - -Özel konumlar: - - /moon # Ay evresi (Şehir veya ülke için +TR veya +İstanbul ekleyin) - /moon@2016-10-25 # Belirli bir tarih için ay evresi (@2016-10-25) - -Ölçü birimleri: - - ?m # metrik sistem (SI) (ABD dışında her yer için varsayılan) - ?u # USCS (ABD için varsayılan) - ?M # Rüzgar hızını metre/saniye(m/s) olarak göster - -Seçenekleri görüntüle: - - ?0 # sadece bugün için hava durumu - ?1 # Bugün ve 1 gün sonrası için hava durumu - ?2 # Bugün ve 2 gün sonrası için hava durumu - ?A # Kullanıcı aracısı(User-Agent) bilgilerini göz ardı eder ve terminalde ANSI formatında çıktı için zorlar - ?F # "Follow(Takip et)" satırını göstermez - ?n # dar görünüm (sadece gece ve gündüz) - ?q # sessiz görünüm ("Hava durumu" yazısı yok) - ?Q # aşırı sessiz görünüm ("Hava durumu" yazısı ve şehir adı yok) - ?T # terminal geçişlerini kapatır (renkler yok) - -PNG seçenekleri: - - /istanbul.png # bir PNG dosyası üretir - ?p # çıktı etrafına bir çerçeve ekler - ?t # 150 birim saydamlık - transparency=... # 0 ila 255 arasında saydamlık (255 = saydam değil) - -Seçenekler birleştirilebilir: - - /Istanbul?0pq - /Istanbul?0pq&lang=fr - /Istanbul_0pq.png # PNG dosya modları _ karakterinden sonra belirtilir - /izmir_0pq_lang=it.png # uzun seçenekler alt çizgi ile ayrılır - -Yerelleştirme: - - $ curl tr.wttr.in/Istanbul - $ curl wttr.in/izmir?lang=tr - $ curl -H "Accept-Language: tr" wttr.in/izmir - -Desteklenen diller: - - FULL_TRANSLATION (destekleniyor) - PARTIAL_TRANSLATION (geliştirme aşamasında) - -Özel adresler: - - /:help # bu sayfayı göster - /:bash.function # önerilen bash fonksiyonu wttr() içeriğini göster - /:translation # çevirmenler hakkındaki bilgileri göster diff --git a/legacy/share/translations/tr.txt b/legacy/share/translations/tr.txt deleted file mode 100644 index 730e273..0000000 --- a/legacy/share/translations/tr.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Açık : Clear -113: Güneşli : Sunny -116: Parçalı bulutlu : Partly cloudy -119: Bulutlu : Cloudy -122: Kapalı : Overcast -143: Puslu : Mist -176: Yer yer yağmur görülebilir : Patchy rain possible -179: Yer yer kar görülebilir : Patchy snow possible -182: Yer yer karla karışık yağmur görülebilir : Patchy sleet possible -185: Yer yer donan çisenti olabilir : Patchy freezing drizzle possible -200: Gök gürültülü fırtına görülebilir : Thundery outbreaks possible -227: Tipi halinde kar yağışı : Blowing snow -230: Kar fırtınası : Blizzard -248: Sisli : Fog -260: Donan sis : Freezing fog -263: Yer yer hafif donan çisenti : Patchy light drizzle -266: Yer yer donan çisenti : Light drizzle -281: Donan çisenti : Freezing drizzle -284: Kuvvetli don : Heavy freezing drizzle -293: Yer yer hafif yağmurlu : Patchy light rain -296: Hafif yağmurlu : Light rain -299: Zaman zaman orta kuvvette yağmur : Moderate rain at times -302: Orta kuvvette yağmur : Moderate rain -305: Zaman zaman şiddetli yağmur : Heavy rain at times -308: Şiddetli yağmur : Heavy rain -311: Ayaz ile hafif yağmur : Light freezing rain -314: Ayaz ile orta kuvvette veya şiddetli yağmur : Moderate or heavy freezing rain -317: Hafif karla karışık yağmur : Light sleet -320: Orta kuvvette veya şiddeli sulu kar : Moderate or heavy sleet -323: Yer yer hafif kar yağışı : Patchy light snow -326: Hafif kar yağışı : Light snow -329: Yer yer orta şiddette kar yağışı : Patchy moderate snow -332: Orta kuvvette kar yağışı : Moderate snow -335: Yer yer kuvvetli kar yağışı : Patchy heavy snow -338: Kuvvetli kar yağışı : Heavy snow -350: Dolu yağışı : Ice pellets -353: Hafif sağanak yağmur : Light rain shower -356: Orta kuvvette veya şiddetli sağanak yağmur : Moderate or heavy rain shower -359: Sel riski olan şiddetli sağanak yağmur : Torrential rain shower -362: Hafif karla karışık sağanak yağmur : Light sleet showers -365: Orta veya şiddetli karla karışık sağanak yağmur : Moderate or heavy sleet showers -368: Hafif sağanak kar yağışı : Light snow showers -371: Orta kuvvette veya şiddetli sağanak kar yağışı : Moderate or heavy snow showers -386: Yer yer gök gürültülü ve yağmurlu : Patchy light rain with thunder -389: Orta kuvvette veya şiddetli gök gürültülü yağmur : Moderate or heavy rain with thunder -392: Yer yer gök gürültülü ve karlı : Patchy light snow with thunder -395: Orta kuvvette veya şiddetli gök gürültülü kar : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/uk-help.txt b/legacy/share/translations/uk-help.txt deleted file mode 100644 index 43bb445..0000000 --- a/legacy/share/translations/uk-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Використання: - - $ curl wttr.in # поточне місцеположення - $ curl wttr.in/kbp # погода в аеропорту Бориспіль (код ICAO: KBP) - -Підтримуються наступні типи місцеположень: - - /paris # місто - /~Eiffel+tower # будь-яке місцеположення - /Киів # юнікодне ім'я будь-якого місцеположення будь-якою мовою - /muc # код аеропорту ICAO (3 літери) - /@stackoverflow.com # доменне им'я - /94107 # поштовый індекс (тільки для США) - /-78.46,106.79 # GPS-координати - -Спеціальні умовні місцеположення: - - /moon # Фаза Місяця (додайте ,+US або ,+France для міста Moon у США або Франції) - /moon@2016-10-25 # Фаза Місяця для вказаної дати (@2016-10-25) - -Одиниці вимірювань: - - ?m # метричні (СІ) (використовуються всюди крім США) - ?u # USCS (використовуються у США) - ?M # показувати швидкість вітру в м/с - -Опції відображення: - - ?0 # тільки поточна погода - ?1 # погода сьогодні + 1 день - ?2 # погода сьогодні + 2 дня - ?n # вузька версія (тільки день та ніч) - ?q # тиха версія (без тексту "Прогноз погоди") - ?Q # надтиха версія (без "Прогноз погоди", немає назви міста) - ?T # відключити послідовності терміналу (без кольорів) - -PNG-опції: - - /paris.png # сгенерувати PNG-файл - ?p # добавити рамку навколо - ?t # transparency=150 (прозорість 150) - transparency=... # прозорість від 0 до 255 (255 = не прозорий) - -Опції можна комбінувати: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # в PNG-запитах опції вказуються після знаку _ - /Rome_0pq_lang=it.png # довгі опції розділяются знаком підкреслення _ - -Локалізація: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Мови що підтримуються: - - FULL_TRANSLATION (підтримується) - PARTIAL_TRANSLATION (в процесі) - -Спеціальні строрінки: - - /:help # показати цю сторінку - /:bash.function # показати рекомендовану функцію wttr() - /:translation # показати список перекладачів wttr.in - diff --git a/legacy/share/translations/uk.txt b/legacy/share/translations/uk.txt deleted file mode 100644 index 6f00800..0000000 --- a/legacy/share/translations/uk.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Ясно : Clear : -113: Сонячно : Sunny : -116: Змінна хмарність : Partly cloudy : -119: Хмарно : Cloudy : -122: Похмуро : Overcast : -143: Невеликий туман : Mist : -176: Місцями дощ : Patchy rain possible : -179: Місцями сніг : Patchy snow possible : -182: Місцями дощ зі снігом : Patchy sleet possible : -185: Місцями ожеледь : Patchy freezing drizzle possible : -200: Місцями грози : Thundery outbreaks possible : -227: Заметіль : Blowing snow : -230: Снігова буря : Blizzard : -248: Туман : Fog : -260: Крижаний туман : Freezing fog : -263: Місцями мряка : Patchy light drizzle : -266: Мряка : Light drizzle : -281: Ожеледь : Freezing drizzle : -284: Сильна ожеледь : Heavy freezing drizzle : -293: Місцями невеликий дощ : Patchy light rain : -296: Невеликий дощ : Light rain : -299: Часом помірний дощ : Moderate rain at times : -302: Помірний дощ : Moderate rain : -305: Часом сильний дощ : Heavy rain at times : -308: Сильний дощ : Heavy rain : -311: Слабкий крижаний дощ : Light freezing rain : -314: Крижаний дощ : Moderate or heavy freezing rain : -317: Невеликий дощ зі снігом : Light sleet : -320: Дощ зі снігом : Moderate or heavy sleet : -323: Місцями невеликий сніг : Patchy light snow : -326: Невеликий сніг : Light snow : -329: Місцями помірний сніг : Patchy moderate snow : -332: Помірний сніг : Moderate snow : -335: Місцями сильний сніг : Patchy heavy snow : -338: Сильний сніг : Heavy snow : -350: Льодяний дощ : Ice pellets : -353: Невелика злива : Light rain shower : -356: Злива : Moderate or heavy rain shower : -359: Дуже сильна злива : Torrential rain shower : -362: Невеликий мокрий сніг : Light sleet showers : -365: Мокрий сніг : Moderate or heavy sleet showers : -368: Невеликий сніг : Light snow showers : -371: Сніг : Moderate or heavy snow showers : -386: Місцями дощ з грозою : Patchy light rain with thunder : -389: Дощ з грозою : Moderate or heavy rain with thunder : -392: Місцями сніг з грозою : Patchy light snow with thunder : -395: Сніг з грозою : Moderate or heavy snow with thunder : diff --git a/legacy/share/translations/uz.txt b/legacy/share/translations/uz.txt deleted file mode 100644 index 8174760..0000000 --- a/legacy/share/translations/uz.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Ochiq havo : Clear : Ясно -113: Quyoshli : Sunny : Солнечно -116: Qisman bulutli : Partly cloudy : Переменная облачность -119: Bulutli : Cloudy : Облачно -122: Bulutli : Overcast : Пасмурно -143: Tuman : Mist : Дымка -176: Joylarda yomg'ir ehtimoli : Patchy rain possible : Местами дождь -179: Joylarda qor ehtimoli : Patchy snow possible : Местами снег -182: Joylarda yomg'ir aralash qor ehtimoli : Patchy sleet possible : Местами дождь со снегом -185: Joylarda muzlatuvchi mayda yomg'ir ehtimoli : Patchy freezing drizzle possible : Местами замерзающая морось -200: Momoqaldiroq ehtimoli : Thundery outbreaks possible : Местами грозы -227: Qorli izg'irin : Blowing snow : Поземок -230: Bo'ron : Blizzard : Метель -248: Tuman : Fog : Туман -260: Sovuq tuman : Freezing fog : Переохлажденный туман -263: Joylarda yengil yomg'ir : Patchy light drizzle : Местами слабая морось -266: Yengil yomg'ir : Light drizzle : Слабая морось -281: Muzlatuvchi yomg'ir : Freezing drizzle : Замерзающая морось -284: Kuchli muzlatuvchi yomg'ir : Heavy freezing drizzle : Сильная замерзающая морось -293: Joylarda yengil yomg'ir : Patchy light rain : Местами небольшой дождь -296: Yengil yomg'ir : Light rain : Небольшой дождь -299: Vaqti bilan o'rtacha yomg'ir : Moderate rain at times : Временами умеренный дождь -302: O'rtacha yomg'ir : Moderate rain : Умеренный дождь -305: Vaqti bilan kuchli yomg'ir : Heavy rain at times : Временами сильный дождь -308: Kuchli yomg'ir : Heavy rain : Сильный дождь -311: Yengil muzlatuvchi yomg'ir : Light freezing rain : Слабый переохлажденный дождь -314: O'rtacha yoki kuchli muzlatuvchi yomg'ir : Moderate or heavy freezing rain : Умеренный или сильный переохлажденный дождь -317: Yengil yomg'ir aralash qor : Light sleet : Небольшой дождь со снегом -320: O'rtacha yoki kuchli yomg'ir aralash qor : Moderate or heavy sleet : Умеренный или сильный дождь со снегом -323: Joylarda yengil qor : Patchy light snow : Местами небольшой снег -326: Yengil qor : Light snow : Небольшой снег -329: Joylarda o'rtacha qor : Patchy moderate snow : Местами умеренный снег -332: O'rtacha qor : Moderate snow : Умеренный снег -335: Joylarda kuchli qor : Patchy heavy snow : Местами сильный снег -338: Kuchli qor : Heavy snow : Сильный снег -350: Do'l : Ice pellets : Ледяной дождь -353: Qisqa jala : Light rain shower : Небольшой ливневый дождь -356: O'rtacha yoki kuchli jala : Moderate or heavy rain shower : Умеренный или сильный ливневый дождь -359: Shiddatli jala : Torrential rain shower : Очень сильный ливень -362: Qisqa qorli jala : Light sleet showers : Небольшой ливневый дождь со снегом -365: O'rtacha yoki kuchli qorli jala : Moderate or heavy sleet showers : Небольшой снег -368: Qisqa qor aralash yomg'ir : Light snow showers : Небольшой ливневый дождь со снегом -371: O'rtacha yoki kuchli qorli jala : Moderate or heavy snow showers : Умеренный или сильный снежный ливень -386: Joylarda yengil yomg'ir va momaqaldiroq : Patchy light rain with thunder : Местами небольшой дождь с грозой -389: O'rtacha yoki kuchli yomg'ir va momaqaldiroq : Moderate or heavy rain with thunder : Умеренный или сильный дождь с грозой -392: Joylarda yengil qor va momaqaldiroq : Patchy light snow with thunder : Местами небольшой снег с грозой -395: O'rtacha yoku kuchli qor va momaqaldiroq : Moderate or heavy snow with thunder : Умеренный или сильный снег с грозой diff --git a/legacy/share/translations/vi-help.txt b/legacy/share/translations/vi-help.txt deleted file mode 100644 index cc3732f..0000000 --- a/legacy/share/translations/vi-help.txt +++ /dev/null @@ -1,67 +0,0 @@ -Cách dùng: - - $ curl wttr.in # vị trí hiện tại - $ curl wttr.in/sgn # thời tiết sân bay Tân Sơn Nhất - -Các loại địa điểm được hỗ trợ: - - /paris # tên thành phố - /~Eiffel+tower # địa điểm nổi tiếng bất kỳ - /Москва # tên địa điểm Unicode trong bất cứ ngôn ngữ nào - /sgn # mã sân bay IATA (3 ký tự) - /@stackoverflow.com # tên miền - /94107 # mã vùng (chỉ cho Hoa Kỳ) - /-78.46,106.79 # tọa độ - -Địa điểm đặc biệt: - - /moon # pha mặt trăng (thêm ,+US hoặc ,+France để lấy chu kỳ mặt trăng cho địa điểm đó) - /moon@2016-10-25 # pha mặt trăng của 1 ngày (@2016-10-25) - -Đơn vị: - - ?m # hệ mét (SI) (mặc định cho mọi nơi trừ Mỹ) - ?u # USCS (mặc định cho Mỹ) - ?M # tốc độ gió theo m/s - -Tùy chọn hiển thị: - - ?0 # Chỉ hiện thời tiết hiện tại - ?1 # Thời tiết hiện tại + 1 ngày - ?2 # Thời tiết hiện tại + 2 ngày - ?n # bản rút gọn (chỉ có ngày & đêm) - ?q # bản thu nhỏ (không có dòng "Báo cáo thời tiết") - ?Q # bản siêu nhỏ (không có dòng "Báo cáo thời tiết" và địa điểm) - ?T # tắt escape sequence cho terminal (không màu) - -Tùy chọn PNG: - - /paris.png # tạo ra file PNG - ?p # thêm khung xung quanh - ?t # độ trong suốt = 150 - transparency=... # độ trong suốt từ 0 tới 255 (255 = không trong suốt) - -Kết hợp các tùy chọn: - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # với file PNG thì tùy chọn nằm phía sau dấu _ - /Rome_0pq_lang=it.png # các tùy chọn phân cách với nhau bằng dấu _ - -Bản địa hóa: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -Các ngôn ngữ được hỗ trợ: - - FULL_TRANSLATION (hỗ trợ) - PARTIAL_TRANSLATION (chưa dịch hoàn toàn) - -URL đặc biệt: - - /:help # hiện trang này - /:bash.function # hiện hàm wttr() được đề nghị cho bash - /:translation # hiện thông tin về người biên dịch - diff --git a/legacy/share/translations/vi.txt b/legacy/share/translations/vi.txt deleted file mode 100644 index 40dddf1..0000000 --- a/legacy/share/translations/vi.txt +++ /dev/null @@ -1,47 +0,0 @@ -113: Trời trong : Clear -113: Trời nắng : Sunny -116: Có mây : Partly cloudy -119: Nhiều mây : Cloudy -122: Âm u : Overcast -143: Sương mù : Mist -176: Có mưa rải rác : Patchy rain possible -179: Có tuyết rải rác : Patchy snow possible -182: Có mưa đá rải rác : Patchy sleet possible -185: Có mưa phùn băng rải rác : Patchy freezing drizzle possible -200: Có dông : Thundery outbreaks possible -227: Tuyết bay : Blowing snow -230: Bão tuyết : Blizzard -248: Sương mù : Fog -260: Sương mù đóng băng : Freezing fog -263: Mưa phùn nhẹ rải rác : Patchy light drizzle -266: Mưa phùn nhẹ : Light drizzle -281: Mưa phùn băng : Freezing drizzle -284: Mưa phùn băng to : Heavy freezing drizzle -293: Mưa nhẹ rải rác : Patchy light rain -296: Mưa nhỏ : Light rain -299: Thỉnh thoảng có mưa vừa : Moderate rain at times -302: Mưa vừa : Moderate rain -305: Thỉnh thoảng có mưa to : Heavy rain at times -308: Mưa to : Heavy rain -311: Mưa băng giá nhẹ : Light freezing rain -314: Mưa băng giá vừa đến to : Moderate or heavy freezing rain -317: Mưa đá nhỏ : Light sleet -320: Mưa đá vừa đến to : Moderate or heavy sleet -323: Tuyết rơi nhẹ rải rác : Patchy light snow -326: Tuyết rơi nhẹ : Light snow -329: Tuyết rơi vừa rải rác : Patchy moderate snow -332: Tuyết rơi vừa : Moderate snow -335: Tuyết rơi dày rải rác : Patchy heavy snow -338: Tuyết rơi dày : Heavy snow -350: Mưa đá : Ice pellets -353: Mưa rào nhẹ : Light rain shower -356: Mưa rào vừa đến to : Moderate or heavy rain shower -359: Mưa rào xối xả : Torrential rain shower -362: Mưa rào đá nhẹ : Light sleet showers -365: Mưa rào đá vừa đến to : Moderate or heavy sleet showers -368: Mưa rào tuyết nhỏ : Light snow showers -371: Mưa rào tuyết vừa đến to : Moderate or heavy snow showers -386: Mưa rào nhẹ có dông rải rác : Patchy light rain with thunder -389: Mưa dông vừa đến to : Moderate or heavy rain with thunder -392: Tuyết rơi nhẹ có dông rải rác : Patchy light snow with thunder -395: Tuyết rơi vừa đến dày có dông rải rác : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/zh-cn-help.txt b/legacy/share/translations/zh-cn-help.txt deleted file mode 100644 index d0894fb..0000000 --- a/legacy/share/translations/zh-cn-help.txt +++ /dev/null @@ -1,69 +0,0 @@ -用法: - - $ curl wttr.in # 当前位置 - $ curl wttr.in/pek # 机场三字码 - -支持的位置类型: - - /paris # 城市名称 - /~Eiffel+tower # 任意地点 - /北京 # 任意语言的任意地点 - /PEK # 机场三字码 - /@stackoverflow.com # 域名 - /94107 # 区域代码 - /-78.46,106.79 # GPS 坐标 - -特殊位置: - - /moon # 月相(加上 ,+US 或 ,+France 以察看特定城市的月相) - /moon@2016-10-25 # 特定日期的月相(@2016-10-25) - -单位: - - m # 公制(国际单位制)(除美国外该单位制为默认值) - u # USCS(美国默认单位制) - M # 以米/秒为单位显示风速 - -查看选项: - - 0 # 仅当前天气 - 1 # 当前天气 + 未来 1 天 - 2 # 当前天气 + 未来 2 天 - A # 忽略代理(User-Agent)并强制使用 ANSI 输出格式(终端模式) - F # 不显示「关注」(Follow)那行 - n # 较窄模式(仅日夜) - q # 简练模式(无「天气预报」文字) - Q # 极简模式(无「天气预报」、无城市名称) - T # 关闭终端转义序列(无颜色) - -PNG 选项: - - /paris.png # 生成 PNG 文件 - p # 在输出图像周围增加缩进空白 - t # 透明度 150 - transparency=... # 透明度从 0 到 255(255 = 不透明) - -可合并使用的选项 - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # PNG 文件模式中在下划线 _ 后指定选项 - /Rome_0pq_lang=it.png # 用下划线分隔长选项 - -本地化: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -支持的语言: - - FULL_TRANSLATION (supported) - PARTIAL_TRANSLATION (in progress) - -特殊 URL: - - /:help # 显示此页面 - /:bash.function # 显示建议的 bash 函数 wttr() - /:translation # 显示翻译者信息 - diff --git a/legacy/share/translations/zh-cn.txt b/legacy/share/translations/zh-cn.txt deleted file mode 100644 index 95b7aaa..0000000 --- a/legacy/share/translations/zh-cn.txt +++ /dev/null @@ -1,47 +0,0 @@ -113:晴 : Clear -113:晴 : Sunny -116:少云 : Partly cloudy -119:多云 : Cloudy -122:阴 : Overcast -143:轻雾 : Mist -176:局部下小雨 : Patchy rain possible -179:局部下小雪 : Patchy snow possible -182:局部有雨夹雪 : Patchy sleet possible -185:局部有冻毛毛雨 : Patchy freezing drizzle possible -200:可能打雷 : Thundery outbreaks possible -227:小雪 : Blowing snow -230:暴雪 : Blizzard -248:雾 : Fog -260:冻雾 : Freezing fog -263:局部毛毛雨 : Patchy light drizzle -266:毛毛雨 : Light drizzle -281:冻毛毛雨 : Freezing drizzle -284:大冻毛毛雨 : Heavy freezing drizzle -293:局部小雨 : Patchy light rain -296:小雨 : Light rain -299:有时中雨 : Moderate rain at times -302:中雨 : Moderate rain -305:有时大雨 : Heavy rain at times -308:大雨 : Heavy rain -311:小冻雨 : Light freezing rain -314:中或大冻雨 : Moderate or heavy freezing rain -317:小雨夹雪 : Light sleet -320:中或大雨夹雪 : Moderate or heavy sleet -323:局部小雪 : Patchy light snow -326:小雪 : Light snow -329:局部中雪 : Patchy moderate snow -332:中雪 : Moderate snow -335:局部大雪 : Patchy heavy snow -338:大雪 : Heavy snow -350:冰丸 : Ice pellets -353:小阵雨 : Light rain shower -356:中或大阵雨 : Moderate or heavy rain shower -359:暴阵雨 : Torrential rain shower -362:小阵雨夹雪 : Light sleet showers -365:中或大阵雨夹雪 : Moderate or heavy sleet showers -368:小阵雪 : Light snow showers -371:中或大阵雪 : Moderate or heavy snow showers -386:局部小雷阵雨 : Patchy light rain with thunder -389:中或大雷阵雨 : Moderate or heavy rain with thunder -392:小雷阵雪 : Patchy light snow with thunder -395:中或大雷阵雪 : Moderate or heavy snow with thunder diff --git a/legacy/share/translations/zh-tw-help.txt b/legacy/share/translations/zh-tw-help.txt deleted file mode 100644 index 3a3dcae..0000000 --- a/legacy/share/translations/zh-tw-help.txt +++ /dev/null @@ -1,69 +0,0 @@ -使用方法 - - $ curl wttr.in # 目前位置 - $ curl wttr.in/muc # 慕尼黑機場的天氣 - -支援的位置類型: - - /paris # 城市名稱 - /~Eiffel+tower # 任意地點 - /Москва # 任意地點在任何語言的 Unicode 名稱 - /muc # 機場代碼(3個字母) - /@stackoverflow.com # 網域名稱 - /94107 # 區域代碼 - /-78.46,106.79 # GPS 座標 - -特殊位置: - - /moon # 月相(加入 ,+US 或 ,+France 來觀看這些地方的月相) - /moon@2016-10-25 # 特定日期的月相 (@2016-10-25) - -單位: - - m # 公制(國際單位制)(除了美國以外的地方皆預設使用此單位置) - u # USCS(美國預設使用) - M # 以公尺/秒為單位顯示風速 - -檢視選項: - - 0 # 僅目前的天氣 - 1 # 目前的天氣+未來1天 - 2 # 目前的天氣+未來2天 - A # 忽略使用者代理字串並強制使用 ANSI 輸出格式(終端機) - F # 不要顯示「追蹤」那行 - n # 窄版(僅日夜) - q # 安靜版(無「天氣報告」文字) - Q # 超安靜版(無「天氣報告」、無城市名稱) - T # 關閉終端機序列(無色彩) - -PNG 選項: - - /paris.png # 生成 PNG 檔案 - p # 在輸出周圍新增框架 - t # 透明度 150 - transparency=... # 透明度從 0 到 255(255 = 不透明) - -可合併使用的選項 - - /Paris?0pq - /Paris?0pq&lang=fr - /Paris_0pq.png # PNG 檔案模式於 _ 後指定 - /Rome_0pq_lang=it.png # 以底線分隔長選項 - -在地化: - - $ curl fr.wttr.in/Paris - $ curl wttr.in/paris?lang=fr - $ curl -H "Accept-Language: fr" wttr.in/paris - -支援的語言: - - FULL_TRANSLATION (supported) - PARTIAL_TRANSLATION (in progress) - -特殊 URL: - - /:help # 顯示此頁面 - /:bash.function # 顯示建議的 bash 函式 wttr() - /:translation # 顯示關於譯者的資訊 - diff --git a/legacy/share/translations/zh-tw.txt b/legacy/share/translations/zh-tw.txt deleted file mode 100644 index 6bb7c16..0000000 --- a/legacy/share/translations/zh-tw.txt +++ /dev/null @@ -1,81 +0,0 @@ -113: 晴朗 : Clear : -113: 陽光充足 : Sunny : -116: 晴時多雲 : Partly cloudy : -119: 多雲 : Cloudy : -122: 陰天 : Overcast : -143: 薄霧 : Mist : -176: 可能下小雨 : Patchy rain possible : -179: 可能下小雪 : Patchy snow possible : -182: 可能有雨夾雪 : Patchy sleet possible : -185: 可能有凍毛毛雨 : Patchy freezing drizzle possible : -200: 可能打雷 : Thundery outbreaks possible : -227: 吹雪 : Blowing snow : -230: 雪暴 : Blizzard : -248: 霧 : Fog : -260: 凍霧 : Freezing fog : -263: 局部毛毛細雨 : Patchy light drizzle : -266: 毛毛細雨 : Light drizzle : -281: 凍毛毛雨 : Freezing drizzle : -284: 重凍毛毛雨 : Heavy freezing drizzle : -293: 局部小雨 : Patchy light rain : -296: 小雨 : Light rain : -299: 有時中雨 : Moderate rain at times : -302: 中雨 : Moderate rain : -305: 有時大雨 : Heavy rain at times : -308: 大雨 : Heavy rain : -311: 小凍雨 : Light freezing rain : -314: 中或大凍雨 : Moderate or heavy freezing rain : -317: 小雨夾雪 : Light sleet : -320: 中或大雨夾雪 : Moderate or heavy sleet : -323: 局部小雪 : Patchy light snow : -326: 小雪 : Light snow : -329: 局部中雪 : Patchy moderate snow : -332: 中雪 : Moderate snow : -335: 局部大雪 : Patchy heavy snow : -338: 大雪 : Heavy snow : -350: 冰珠 : Ice pellets : -353: 小陣雨 : Light rain shower : -356: 中或大陣雨 : Moderate or heavy rain shower : -359: 豪陣雨 : Torrential rain shower : -362: 小陣雨夾雪 : Light sleet showers : -365: 中或大陣雨夾雪 : Moderate or heavy sleet showers : -368: 小陣雪 : Light snow showers : -371: 中或大陣雪 : Moderate or heavy snow showers : -386: 局部小雷雨 : Patchy light rain with thunder : -389: 中或大雷雨 : Moderate or heavy rain with thunder : -392: 可能會打雷的小陣雪 : Patchy light snow with thunder : -395: 可能會打雷的中或大陣雪 : Moderate or heavy snow with thunder : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/legacy/share/we-lang/we-lang.go b/legacy/share/we-lang/we-lang.go deleted file mode 100644 index ff9fa05..0000000 --- a/legacy/share/we-lang/we-lang.go +++ /dev/null @@ -1,1193 +0,0 @@ -package main - -import ( - "bytes" - _ "crypto/sha512" - "encoding/json" - "flag" - "fmt" - "io/ioutil" - "log" - "math" - "net/http" - "net/url" - "os" - "os/user" - "path" - "regexp" - "strconv" - "strings" - "time" - "unicode/utf8" - - "github.com/klauspost/lctime" - "github.com/mattn/go-colorable" - "github.com/mattn/go-runewidth" -) - -type configuration struct { - APIKey string - City string - Numdays int - Imperial bool - WindUnit bool - Inverse bool - Lang string - Narrow bool - LocationName string - WindMS bool - RightToLeft bool -} - -type cond struct { - ChanceOfRain string `json:"chanceofrain"` - FeelsLikeC int `json:",string"` - PrecipMM float32 `json:"precipMM,string"` - TempC int `json:"tempC,string"` - TempC2 int `json:"temp_C,string"` - Time int `json:"time,string"` - VisibleDistKM int `json:"visibility,string"` - WeatherCode int `json:"weatherCode,string"` - WeatherDesc []struct{ Value string } - WindGustKmph int `json:",string"` - Winddir16Point string - WindspeedKmph int `json:"windspeedKmph,string"` -} - -type astro struct { - Moonrise string - Moonset string - Sunrise string - Sunset string -} - -type weather struct { - Astronomy []astro - Date string - Hourly []cond - MaxtempC int `json:"maxtempC,string"` - MintempC int `json:"mintempC,string"` -} - -type loc struct { - Query string `json:"query"` - Type string `json:"type"` -} - -type resp struct { - Data struct { - Cur []cond `json:"current_condition"` - Err []struct{ Msg string } `json:"error"` - Req []loc `json:"request"` - Weather []weather `json:"weather"` - } `json:"data"` -} - -var ( - ansiEsc *regexp.Regexp - config configuration - configpath string - debug bool - windDir = map[string]string{ - "N": "\033[1m↓\033[0m", - "NNE": "\033[1m↓\033[0m", - "NE": "\033[1m↙\033[0m", - "ENE": "\033[1m↙\033[0m", - "E": "\033[1m←\033[0m", - "ESE": "\033[1m←\033[0m", - "SE": "\033[1m↖\033[0m", - "SSE": "\033[1m↖\033[0m", - "S": "\033[1m↑\033[0m", - "SSW": "\033[1m↑\033[0m", - "SW": "\033[1m↗\033[0m", - "WSW": "\033[1m↗\033[0m", - "W": "\033[1m→\033[0m", - "WNW": "\033[1m→\033[0m", - "NW": "\033[1m↘\033[0m", - "NNW": "\033[1m↘\033[0m", - } - unitRain = map[bool]string{ - false: "mm", - true: "in", - } - unitTemp = map[bool]string{ - false: "C", - true: "F", - } - unitVis = map[bool]string{ - false: "km", - true: "mi", - } - unitWind = map[int]string{ - 0: "km/h", - 1: "mph", - 2: "m/s", - } - slotTimes = [slotcount]int{9 * 60, 12 * 60, 18 * 60, 22 * 60} - codes = map[int][]string{ - 113: iconSunny, - 116: iconPartlyCloudy, - 119: iconCloudy, - 122: iconVeryCloudy, - 143: iconFog, - 176: iconLightShowers, - 179: iconLightSleetShowers, - 182: iconLightSleet, - 185: iconLightSleet, - 200: iconThunderyShowers, - 227: iconLightSnow, - 230: iconHeavySnow, - 248: iconFog, - 260: iconFog, - 263: iconLightShowers, - 266: iconLightRain, - 281: iconLightSleet, - 284: iconLightSleet, - 293: iconLightRain, - 296: iconLightRain, - 299: iconHeavyShowers, - 302: iconHeavyRain, - 305: iconHeavyShowers, - 308: iconHeavyRain, - 311: iconLightSleet, - 314: iconLightSleet, - 317: iconLightSleet, - 320: iconLightSnow, - 323: iconLightSnowShowers, - 326: iconLightSnowShowers, - 329: iconHeavySnow, - 332: iconHeavySnow, - 335: iconHeavySnowShowers, - 338: iconHeavySnow, - 350: iconLightSleet, - 353: iconLightShowers, - 356: iconHeavyShowers, - 359: iconHeavyRain, - 362: iconLightSleetShowers, - 365: iconLightSleetShowers, - 368: iconLightSnowShowers, - 371: iconHeavySnowShowers, - 374: iconLightSleetShowers, - 377: iconLightSleet, - 386: iconThunderyShowers, - 389: iconThunderyHeavyRain, - 392: iconThunderySnowShowers, - 395: iconHeavySnowShowers, - } - - iconUnknown = []string{ - " .-. ", - " __) ", - " ( ", - " `-’ ", - " • "} - iconSunny = []string{ - "\033[38;5;226m \\ / \033[0m", - "\033[38;5;226m .-. \033[0m", - "\033[38;5;226m ― ( ) ― \033[0m", - "\033[38;5;226m `-’ \033[0m", - "\033[38;5;226m / \\ \033[0m"} - iconPartlyCloudy = []string{ - "\033[38;5;226m \\ /\033[0m ", - "\033[38;5;226m _ /\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m \\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - " "} - iconCloudy = []string{ - " ", - "\033[38;5;250m .--. \033[0m", - "\033[38;5;250m .-( ). \033[0m", - "\033[38;5;250m (___.__)__) \033[0m", - " "} - iconVeryCloudy = []string{ - " ", - "\033[38;5;240;1m .--. \033[0m", - "\033[38;5;240;1m .-( ). \033[0m", - "\033[38;5;240;1m (___.__)__) \033[0m", - " "} - iconLightShowers = []string{ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"} - iconHeavyShowers = []string{ - "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m", - "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m", - "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m", - "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"} - iconLightSnowShowers = []string{ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;255m * * * \033[0m", - "\033[38;5;255m * * * \033[0m"} - iconHeavySnowShowers = []string{ - "\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m", - "\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m", - "\033[38;5;255;1m * * * * \033[0m", - "\033[38;5;255;1m * * * * \033[0m"} - iconLightSleetShowers = []string{ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m", - "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"} - iconThunderyShowers = []string{ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;228;5m ⚡\033[38;5;111;25m‘‘\033[38;5;228;5m⚡\033[38;5;111;25m‘‘ \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"} - iconThunderyHeavyRain = []string{ - "\033[38;5;240;1m .-. \033[0m", - "\033[38;5;240;1m ( ). \033[0m", - "\033[38;5;240;1m (___(__) \033[0m", - "\033[38;5;21;1m ‚‘\033[38;5;228;5m⚡\033[38;5;21;25m‘‚\033[38;5;228;5m⚡\033[38;5;21;25m‚‘ \033[0m", - "\033[38;5;21;1m ‚’‚’\033[38;5;228;5m⚡\033[38;5;21;25m’‚’ \033[0m"} - iconThunderySnowShowers = []string{ - "\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m", - "\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m", - "\033[38;5;226m /\033[38;5;250m(___(__) \033[0m", - "\033[38;5;255m *\033[38;5;228;5m⚡\033[38;5;255;25m*\033[38;5;228;5m⚡\033[38;5;255;25m* \033[0m", - "\033[38;5;255m * * * \033[0m"} - iconLightRain = []string{ - "\033[38;5;250m .-. \033[0m", - "\033[38;5;250m ( ). \033[0m", - "\033[38;5;250m (___(__) \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m", - "\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"} - iconHeavyRain = []string{ - "\033[38;5;240;1m .-. \033[0m", - "\033[38;5;240;1m ( ). \033[0m", - "\033[38;5;240;1m (___(__) \033[0m", - "\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m", - "\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"} - iconLightSnow = []string{ - "\033[38;5;250m .-. \033[0m", - "\033[38;5;250m ( ). \033[0m", - "\033[38;5;250m (___(__) \033[0m", - "\033[38;5;255m * * * \033[0m", - "\033[38;5;255m * * * \033[0m"} - iconHeavySnow = []string{ - "\033[38;5;240;1m .-. \033[0m", - "\033[38;5;240;1m ( ). \033[0m", - "\033[38;5;240;1m (___(__) \033[0m", - "\033[38;5;255;1m * * * * \033[0m", - "\033[38;5;255;1m * * * * \033[0m"} - iconLightSleet = []string{ - "\033[38;5;250m .-. \033[0m", - "\033[38;5;250m ( ). \033[0m", - "\033[38;5;250m (___(__) \033[0m", - "\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m", - "\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"} - iconFog = []string{ - " ", - "\033[38;5;251m _ - _ - _ - \033[0m", - "\033[38;5;251m _ - _ - _ \033[0m", - "\033[38;5;251m _ - _ - _ - \033[0m", - " "} - - locale = map[string]string{ - "af": "af_ZA", - "ar": "ar_TN", - "az": "az_AZ", - "be": "be_BY", - "bg": "bg_BG", - "bs": "bs_BA", - "ca": "ca_ES", - "cs": "cs_CZ", - "cy": "cy_GB", - "da": "da_DK", - "de": "de_DE", - "el": "el_GR", - "eo": "eo", - "es": "es_ES", - "et": "et_EE", - "eu": "eu_ES", - "fa": "fa_IR", - "fi": "fi_FI", - "fr": "fr_FR", - "fy": "fy_NL", - "ga": "ga_IE", - "he": "he_IL", - "hr": "hr_HR", - "hu": "hu_HU", - "hy": "hy_AM", - "ia": "ia", - "id": "id_ID", - "is": "is_IS", - "it": "it_IT", - "ja": "ja_JP", - "jv": "en_US", - "ka": "ka_GE", - "ko": "ko_KR", - "kk": "kk_KZ", - "ky": "ky_KG", - "lt": "lt_LT", - "lv": "lv_LV", - "mk": "mk_MK", - "ml": "ml_IN", - "nb": "nb_NO", - "nl": "nl_NL", - "nn": "nn_NO", - "oc": "oc_FR", - "pt": "pt_PT", - "pt-br": "pt_BR", - "pl": "pl_PL", - "ro": "ro_RO", - "ru": "ru_RU", - "sv": "sv_SE", - "sk": "sk_SK", - "sl": "sl_SI", - "sr": "sr_RS", - "sr-lat": "sr_RS@latin", - "sw": "sw_KE", - "th": "th_TH", - "tr": "tr_TR", - "uk": "uk_UA", - "uz": "uz_UZ", - "vi": "vi_VN", - "zu": "zu_ZA", - "zh": "zh_CN", - "zh-cn": "zh_CN", - "zh-tw": "zh_TW", - } - - localizedCaption = map[string]string{ - "af": "Weer verslag vir:", - "ar": "تقرير حالة ألطقس", - "az": "Hava proqnozu:", - "be": "Прагноз надвор'я для:", - "bg": "Прогноза за времето в:", - "bs": "Vremenske prognoze za:", - "ca": "Informe del temps per a:", - "cs": "Předpověď počasí pro:", - "cy": "Adroddiad tywydd ar gyfer:", - "da": "Vejret i:", - "de": "Wetterbericht für:", - "el": "Πρόγνωση καιρού για:", - "eo": "Veterprognozo por:", - "es": "El tiempo en:", - "et": "Ilmaprognoos:", - "eu": "Eguraldia:", - "fa": "اوه و بآ تیعضو شرازگ", - "fi": "Säätiedotus:", - "fr": "Prévisions météo pour:", - "fy": "Waarberjocht foar:", - "ga": "Réamhaisnéis na haimsire do:", - "he": ":ריוואה גזמ תיזחת", - "hr": "Vremenska prognoza za:", - "hu": "Időjárás előrejelzés:", - "hy": "Եղանակի տեսություն:", - "ia": "Le tempore a:", - "id": "Prakiraan cuaca:", - "it": "Previsioni meteo:", - "is": "Veðurskýrsla fyrir:", - "ja": "天気予報:", - "jv": "Weather forecast for:", - "ka": "ამინდის პროგნოზი:", - "kk": "Ауа райы:", - "ko": "일기 예보:", - "ky": "Аба ырайы:", - "lt": "Orų prognozė:", - "lv": "Laika ziņas:", - "mk": "Прогноза за времето во:", - "ml": "കാലാവസ്ഥ റിപ്പോർട്ട്:", - "nb": "Værmelding for:", - "nl": "Weerbericht voor:", - "nn": "Vêrmelding for:", - "oc": "Previsions metèo per:", - "pl": "Pogoda w:", - "pt": "Previsão do tempo para:", - "pt-br": "Previsão do tempo para:", - "ro": "Prognoza meteo pentru:", - "ru": "Прогноз погоды:", - "sk": "Predpoveď počasia pre:", - "sl": "Vremenska napoved za", - "sr": "Временска прогноза за:", - "sr-lat": "Vremenska prognoza za:", - "sv": "Väderleksprognos för:", - "sw": "Ripoti ya hali ya hewa, jiji la:", - "te": "వాతావరణ సమాచారము:", - "th": "รายงานสภาพอากาศ:", - "tr": "Hava beklentisi:", - "uk": "Прогноз погоди для:", - "uz": "Ob-havo bashorati:", - "vi": "Báo cáo thời tiết:", - "zu": "Isimo sezulu:", - "zh": "天气预报:", - "zh-cn": "天气预报:", - "zh-tw": "天氣預報:", - } - - daytimeTranslation = map[string][]string{ - "af": {"Oggend", "Middag", "Vroegaand", "Laatnag"}, - "ar": {"ﺎﻠﻠﻴﻟ", "ﺎﻠﻤﺳﺍﺀ", "ﺎﻠﻈﻫﺭ", "ﺎﻠﺼﺑﺎﺣ"}, - "az": {"Səhər", "Gün", "Axşam", "Gecə"}, - "be": {"Раніца", "Дзень", "Вечар", "Ноч"}, - "bg": {"Сутрин", "Обяд", "Вечер", "Нощ"}, - "bs": {"Ujutro", "Dan", "Večer", "Noć"}, - "cs": {"Ráno", "Ve dne", "Večer", "V noci"}, - "ca": {"Matí", "Dia", "Tarda", "Nit"}, - "cy": {"Bore", "Dydd", "Hwyr", "Nos"}, - "da": {"Morgen", "Middag", "Aften", "Nat"}, - "de": {"Früh", "Mittag", "Abend", "Nacht"}, - "el": {"Πρωί", "Μεσημέρι", "Απόγευμα", "Βράδυ"}, - "en": {"Morning", "Noon", "Evening", "Night"}, - "eo": {"Mateno", "Tago", "Vespero", "Nokto"}, - "es": {"Mañana", "Mediodía", "Tarde", "Noche"}, - "et": {"Hommik", "Päev", "Õhtu", "Öösel"}, - "eu": {"Goiza", "Eguerdia", "Arratsaldea", "Gaua"}, - "fa": {"حبص", "رهظ", "رصع", "بش"}, - "fi": {"Aamu", "Keskipäivä", "Ilta", "Yö"}, - "fr": {"Matin", "Après-midi", "Soir", "Nuit"}, - "fy": {"Moarns", "Middeis", "Jûns", "Nachts"}, - "ga": {"Maidin", "Nóin", "Tráthnóna", "Oíche"}, - "he": {"רקוב", "םוֹיְ", "ברֶעֶ", "הלָיְלַ"}, - "hr": {"Jutro", "Dan", "Večer", "Noć"}, - "hu": {"Reggel", "Dél", "Este", "Éjszaka"}, - "hy": {"Առավոտ", "Կեսօր", "Երեկո", "Գիշեր"}, - "ia": {"Matino", "Mediedie", "Vespere", "Nocte"}, - "id": {"Pagi", "Hari", "Petang", "Malam"}, - "it": {"Mattina", "Pomeriggio", "Sera", "Notte"}, - "is": {"Morgunn", "Dagur", "Kvöld", "Nótt"}, - "ja": {"朝", "昼", "夕", "夜"}, - "jv": {"Morning", "Noon", "Evening", "Night"}, - "ka": {"დილა", "დღე", "საღამო", "ღამე"}, - "kk": {"Таң", "Күндіз", "Кеш", "Түн"}, - "ko": {"아침", "낮", "저녁", "밤"}, - "ky": {"Эртең", "Күн", "Кеч", "Түн"}, - "lt": {"Rytas", "Diena", "Vakaras", "Naktis"}, - "lv": {"Rīts", "Diena", "Vakars", "Nakts"}, - "mk": {"Утро", "Пладне", "Вечер", "Ноќ"}, - "ml": {"മോണിംഗ്", "മധ്യാഹ്നം", "വൈകുന്നേരം", "രാത്രി"}, - "nl": {"'s Ochtends", "'s Middags", "'s Avonds", "'s Nachts"}, - "nb": {"Morgen", "Middag", "Kveld", "Natt"}, - "nn": {"Morgon", "Middag", "Kveld", "Natt"}, - "oc": {"Matin", "Jorn", "Vèspre", "Nuèch"}, - "pl": {"Ranek", "Dzień", "Wieczór", "Noc"}, - "pt": {"Manhã", "Meio-dia", "Tarde", "Noite"}, - "pt-br": {"Manhã", "Meio-dia", "Tarde", "Noite"}, - "ro": {"Dimineaţă", "Amiază", "Seară", "Noapte"}, - "ru": {"Утро", "День", "Вечер", "Ночь"}, - "sk": {"Ráno", "Cez deň", "Večer", "V noci"}, - "sl": {"Jutro", "Dan", "Večer", "Noč"}, - "sr": {"Јутро", "Подне", "Вече", "Ноћ"}, - "sr-lat": {"Jutro", "Podne", "Veče", "Noć"}, - "sv": {"Morgon", "Eftermiddag", "Kväll", "Natt"}, - "sw": {"Asubuhi", "Adhuhuri", "Jioni", "Usiku"}, - "te": {"ఉదయం", "రోజు", "సాయంత్రం", "రాత్రి"}, - "th": {"เช้า", "วัน", "เย็น", "คืน"}, - "tr": {"Sabah", "Öğle", "Akşam", "Gece"}, - "uk": {"Ранок", "День", "Вечір", "Ніч"}, - "uz": {"Ertalab", "Kunduzi", "Kechqurun", "Kecha"}, - "vi": {"Sáng", "Trưa", "Chiều", "Tối"}, - "zh": {"早上", "中午", "傍晚", "夜间"}, - "zh-cn": {"早上", "中午", "傍晚", "夜间"}, - "zh-tw": {"早上", "中午", "傍晚", "夜間"}, - "zu": {"Morning", "Noon", "Evening", "Night"}, - } -) - -// Add this languages: -// da tr hu sr jv zu -// More languages: https://developer.worldweatheronline.com/api/multilingual.aspx - -// const ( -// wuri = "https://api.worldweatheronline.com/premium/v1/weather.ashx?" -// suri = "https://api.worldweatheronline.com/premium/v1/search.ashx?" -// slotcount = 4 -// ) - -const ( - wuri = "http://127.0.0.1:5001/premium/v1/weather.ashx?" - suri = "http://127.0.0.1:5001/premium/v1/search.ashx?" - slotcount = 4 -) - -func configload() error { - b, err := ioutil.ReadFile(configpath) - if err == nil { - return json.Unmarshal(b, &config) - } - return err -} - -func configsave() error { - j, err := json.MarshalIndent(config, "", "\t") - if err == nil { - return ioutil.WriteFile(configpath, j, 0600) - } - return err -} - -func pad(s string, mustLen int) (ret string) { - ret = s - realLen := utf8.RuneCountInString(ansiEsc.ReplaceAllLiteralString(s, "")) - delta := mustLen - realLen - if delta > 0 { - if config.RightToLeft { - ret = strings.Repeat(" ", delta) + ret + "\033[0m" - } else { - ret += "\033[0m" + strings.Repeat(" ", delta) - } - } else if delta < 0 { - toks := ansiEsc.Split(s, 2) - tokLen := utf8.RuneCountInString(toks[0]) - esc := ansiEsc.FindString(s) - if tokLen > mustLen { - ret = fmt.Sprintf("%.*s\033[0m", mustLen, toks[0]) - } else { - ret = fmt.Sprintf("%s%s%s", toks[0], esc, pad(toks[1], mustLen-tokLen)) - } - } - return -} - -func formatTemp(c cond) string { - color := func(temp int, explicit_plus bool) string { - var col = 0 - if !config.Inverse { - col = 21 - switch temp { - case -15, -14, -13: - col = 27 - case -12, -11, -10: - col = 33 - case -9, -8, -7: - col = 39 - case -6, -5, -4: - col = 45 - case -3, -2, -1: - col = 51 - case 0, 1: - col = 50 - case 2, 3: - col = 49 - case 4, 5: - col = 48 - case 6, 7: - col = 47 - case 8, 9: - col = 46 - case 10, 11, 12: - col = 82 - case 13, 14, 15: - col = 118 - case 16, 17, 18: - col = 154 - case 19, 20, 21: - col = 190 - case 22, 23, 24: - col = 226 - case 25, 26, 27: - col = 220 - case 28, 29, 30: - col = 214 - case 31, 32, 33: - col = 208 - case 34, 35, 36: - col = 202 - default: - if temp > 0 { - col = 196 - } - } - } else { - col = 16 - switch temp { - case -15, -14, -13: - col = 17 - case -12, -11, -10: - col = 18 - case -9, -8, -7: - col = 19 - case -6, -5, -4: - col = 20 - case -3, -2, -1: - col = 21 - case 0, 1: - col = 30 - case 2, 3: - col = 28 - case 4, 5: - col = 29 - case 6, 7: - col = 30 - case 8, 9: - col = 34 - case 10, 11, 12: - col = 35 - case 13, 14, 15: - col = 36 - case 16, 17, 18: - col = 40 - case 19, 20, 21: - col = 59 - case 22, 23, 24: - col = 100 - case 25, 26, 27: - col = 101 - case 28, 29, 30: - col = 94 - case 31, 32, 33: - col = 166 - case 34, 35, 36: - col = 52 - default: - if temp > 0 { - col = 196 - } - } - } - if config.Imperial { - temp = (temp*18 + 320) / 10 - } - if explicit_plus { - return fmt.Sprintf("\033[38;5;%03dm+%d\033[0m", col, temp) - } else { - return fmt.Sprintf("\033[38;5;%03dm%d\033[0m", col, temp) - } - } - t := c.TempC - if t == 0 { - t = c.TempC2 - } - - hyphen := " - " - // if (config.Lang == "sl") { - // hyphen = "-" - // } - hyphen = ".." - - explicit_plus := false - if c.FeelsLikeC < t { - if c.FeelsLikeC < 0 && t > 0 { - explicit_plus = true - } - return pad(fmt.Sprintf("%s%s%s °%s", color(c.FeelsLikeC, false), hyphen, color(t, explicit_plus), unitTemp[config.Imperial]), 15) - } else if c.FeelsLikeC > t { - if t < 0 && c.FeelsLikeC > 0 { - explicit_plus = true - } - return pad(fmt.Sprintf("%s%s%s °%s", color(t, false), hyphen, color(c.FeelsLikeC, explicit_plus), unitTemp[config.Imperial]), 15) - } - return pad(fmt.Sprintf("%s °%s", color(c.FeelsLikeC, false), unitTemp[config.Imperial]), 15) -} - -func formatWind(c cond) string { - windInRightUnits := func(spd int) int { - if config.WindMS { - spd = (spd * 1000) / 3600 - } else { - if config.Imperial { - spd = (spd * 1000) / 1609 - } - } - return spd - } - color := func(spd int) string { - var col = 46 - switch spd { - case 1, 2, 3: - col = 82 - case 4, 5, 6: - col = 118 - case 7, 8, 9: - col = 154 - case 10, 11, 12: - col = 190 - case 13, 14, 15: - col = 226 - case 16, 17, 18, 19: - col = 220 - case 20, 21, 22, 23: - col = 214 - case 24, 25, 26, 27: - col = 208 - case 28, 29, 30, 31: - col = 202 - default: - if spd > 0 { - col = 196 - } - } - spd = windInRightUnits(spd) - - return fmt.Sprintf("\033[38;5;%03dm%d\033[0m", col, spd) - } - - unitWindString := unitWind[0] - if config.WindMS { - unitWindString = unitWind[2] - } else { - if config.Imperial { - unitWindString = unitWind[1] - } - } - - hyphen := " - " - // if (config.Lang == "sl") { - // hyphen = "-" - // } - hyphen = "-" - - cWindGustKmph := fmt.Sprintf("%s", color(c.WindGustKmph)) - cWindspeedKmph := fmt.Sprintf("%s", color(c.WindspeedKmph)) - if windInRightUnits(c.WindGustKmph) > windInRightUnits(c.WindspeedKmph) { - return pad(fmt.Sprintf("%s %s%s%s %s", windDir[c.Winddir16Point], cWindspeedKmph, hyphen, cWindGustKmph, unitWindString), 15) - } - return pad(fmt.Sprintf("%s %s %s", windDir[c.Winddir16Point], cWindspeedKmph, unitWindString), 15) -} - -func formatVisibility(c cond) string { - if config.Imperial { - c.VisibleDistKM = (c.VisibleDistKM * 621) / 1000 - } - return pad(fmt.Sprintf("%d %s", c.VisibleDistKM, unitVis[config.Imperial]), 15) -} - -func formatRain(c cond) string { - rainUnit := float32(c.PrecipMM) - if config.Imperial { - rainUnit = float32(c.PrecipMM) * 0.039 - } - if c.ChanceOfRain != "" { - return pad(fmt.Sprintf("%.1f %s | %s%%", rainUnit, unitRain[config.Imperial], c.ChanceOfRain), 15) - } - return pad(fmt.Sprintf("%.1f %s", rainUnit, unitRain[config.Imperial]), 15) -} - -func formatCond(cur []string, c cond, current bool) (ret []string) { - var icon []string - if i, ok := codes[c.WeatherCode]; !ok { - icon = iconUnknown - } else { - icon = i - } - if config.Inverse { - // inverting colors - for i, _ := range icon { - icon[i] = strings.Replace(icon[i], "38;5;226", "38;5;94", -1) - icon[i] = strings.Replace(icon[i], "38;5;250", "38;5;243", -1) - icon[i] = strings.Replace(icon[i], "38;5;21", "38;5;18", -1) - icon[i] = strings.Replace(icon[i], "38;5;255", "38;5;245", -1) - icon[i] = strings.Replace(icon[i], "38;5;111", "38;5;63", -1) - icon[i] = strings.Replace(icon[i], "38;5;251", "38;5;238", -1) - } - } - //desc := fmt.Sprintf("%-15.15v", c.WeatherDesc[0].Value) - desc := c.WeatherDesc[0].Value - if config.RightToLeft { - for runewidth.StringWidth(desc) < 15 { - desc = " " + desc - } - for runewidth.StringWidth(desc) > 15 { - _, size := utf8.DecodeLastRuneInString(desc) - desc = desc[size:len(desc)] - } - } else { - for runewidth.StringWidth(desc) < 15 { - desc += " " - } - for runewidth.StringWidth(desc) > 15 { - _, size := utf8.DecodeLastRuneInString(desc) - desc = desc[:len(desc)-size] - } - } - if current { - if config.RightToLeft { - desc = c.WeatherDesc[0].Value - if runewidth.StringWidth(desc) < 15 { - desc = strings.Repeat(" ", 15-runewidth.StringWidth(desc)) + desc - } - } else { - desc = c.WeatherDesc[0].Value - } - } else { - if config.RightToLeft { - if frstRune, size := utf8.DecodeRuneInString(desc); frstRune != ' ' { - desc = "…" + desc[size:len(desc)] - for runewidth.StringWidth(desc) < 15 { - desc = " " + desc - } - } - } else { - if lastRune, size := utf8.DecodeLastRuneInString(desc); lastRune != ' ' { - desc = desc[:len(desc)-size] + "…" - //for numberOfSpaces < runewidth.StringWidth(fmt.Sprintf("%c", lastRune)) - 1 { - for runewidth.StringWidth(desc) < 15 { - desc = desc + " " - } - } - } - } - if config.RightToLeft { - ret = append(ret, fmt.Sprintf("%v %v %v", cur[0], desc, icon[0])) - ret = append(ret, fmt.Sprintf("%v %v %v", cur[1], formatTemp(c), icon[1])) - ret = append(ret, fmt.Sprintf("%v %v %v", cur[2], formatWind(c), icon[2])) - ret = append(ret, fmt.Sprintf("%v %v %v", cur[3], formatVisibility(c), icon[3])) - ret = append(ret, fmt.Sprintf("%v %v %v", cur[4], formatRain(c), icon[4])) - } else { - ret = append(ret, fmt.Sprintf("%v %v %v", cur[0], icon[0], desc)) - ret = append(ret, fmt.Sprintf("%v %v %v", cur[1], icon[1], formatTemp(c))) - ret = append(ret, fmt.Sprintf("%v %v %v", cur[2], icon[2], formatWind(c))) - ret = append(ret, fmt.Sprintf("%v %v %v", cur[3], icon[3], formatVisibility(c))) - ret = append(ret, fmt.Sprintf("%v %v %v", cur[4], icon[4], formatRain(c))) - } - return -} - -func justifyCenter(s string, width int) string { - appendSide := 0 - for runewidth.StringWidth(s) <= width { - if appendSide == 1 { - s = s + " " - appendSide = 0 - } else { - s = " " + s - appendSide = 1 - } - } - return s -} - -func reverse(s string) string { - r := []rune(s) - for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { - r[i], r[j] = r[j], r[i] - } - return string(r) -} - -func printDay(w weather) (ret []string) { - hourly := w.Hourly - ret = make([]string, 5) - for i := range ret { - ret[i] = "│" - } - - // find hourly data which fits the desired times of day best - var slots [slotcount]cond - for _, h := range hourly { - c := int(math.Mod(float64(h.Time), 100)) + 60*(h.Time/100) - for i, s := range slots { - if math.Abs(float64(c-slotTimes[i])) < math.Abs(float64(s.Time-slotTimes[i])) { - h.Time = c - slots[i] = h - } - } - } - - if config.RightToLeft { - slots[0], slots[3] = slots[3], slots[0] - slots[1], slots[2] = slots[2], slots[1] - } - - for i, s := range slots { - if config.Narrow { - if i == 0 || i == 2 { - continue - } - } - ret = formatCond(ret, s, false) - for i := range ret { - ret[i] = ret[i] + "│" - } - } - - d, _ := time.Parse("2006-01-02", w.Date) - // dateFmt := "┤ " + d.Format("Mon 02. Jan") + " ├" - - if val, ok := locale[config.Lang]; ok { - lctime.SetLocale(val) - } else { - lctime.SetLocale("en_US") - } - dateName := "" - if config.RightToLeft { - dow := lctime.Strftime("%a", d) - day := lctime.Strftime("%d", d) - month := lctime.Strftime("%b", d) - dateName = reverse(month) + " " + day + " " + reverse(dow) - } else { - dateName = lctime.Strftime("%a %d %b", d) - if config.Lang == "ko" { - dateName = lctime.Strftime("%b %d일 %a", d) - } - if config.Lang == "zh" || config.Lang == "zh-tw" || config.Lang == "zh-cn" { - dateName = lctime.Strftime("%b%d日%A", d) - } - } - // appendSide := 0 - // // for utf8.RuneCountInString(dateName) <= dateWidth { - // for runewidth.StringWidth(dateName) <= dateWidth { - // if appendSide == 1 { - // dateName = dateName + " " - // appendSide = 0 - // } else { - // dateName = " " + dateName - // appendSide = 1 - // } - // } - - dateFmt := "┤" + justifyCenter(dateName, 12) + "├" - - trans := daytimeTranslation["en"] - if t, ok := daytimeTranslation[config.Lang]; ok { - trans = t - } - if config.Narrow { - - names := "│ " + justifyCenter(trans[1], 16) + - "└──────┬──────┘" + justifyCenter(trans[3], 16) + " │" - - ret = append([]string{ - " ┌─────────────┐ ", - "┌───────────────────────" + dateFmt + "───────────────────────┐", - names, - "├──────────────────────────────┼──────────────────────────────┤"}, - ret...) - - return append(ret, - "└──────────────────────────────┴──────────────────────────────┘") - - } else { - - names := "" - if config.RightToLeft { - names = "│" + justifyCenter(trans[3], 29) + "│ " + justifyCenter(trans[2], 16) + - "└──────┬──────┘" + justifyCenter(trans[1], 16) + " │" + justifyCenter(trans[0], 29) + "│" - } else { - names = "│" + justifyCenter(trans[0], 29) + "│ " + justifyCenter(trans[1], 16) + - "└──────┬──────┘" + justifyCenter(trans[2], 16) + " │" + justifyCenter(trans[3], 29) + "│" - } - - ret = append([]string{ - " ┌─────────────┐ ", - "┌──────────────────────────────┬───────────────────────" + dateFmt + "───────────────────────┬──────────────────────────────┐", - names, - "├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤"}, - ret...) - - return append(ret, - "└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘") - } - return -} - -func unmarshalLang(body []byte, r *resp) error { - var rv map[string]interface{} - if err := json.Unmarshal(body, &rv); err != nil { - return err - } - if data, ok := rv["data"].(map[string]interface{}); ok { - if ccs, ok := data["current_condition"].([]interface{}); ok { - for _, cci := range ccs { - cc, ok := cci.(map[string]interface{}) - if !ok { - continue - } - langs, ok := cc["lang_"+config.Lang].([]interface{}) - if !ok || len(langs) == 0 { - continue - } - weatherDesc, ok := cc["weatherDesc"].([]interface{}) - if !ok || len(weatherDesc) == 0 { - continue - } - weatherDesc[0] = langs[0] - } - } - if ws, ok := data["weather"].([]interface{}); ok { - for _, wi := range ws { - w, ok := wi.(map[string]interface{}) - if !ok { - continue - } - if hs, ok := w["hourly"].([]interface{}); ok { - for _, hi := range hs { - h, ok := hi.(map[string]interface{}) - if !ok { - continue - } - langs, ok := h["lang_"+config.Lang].([]interface{}) - if !ok || len(langs) == 0 { - continue - } - weatherDesc, ok := h["weatherDesc"].([]interface{}) - if !ok || len(weatherDesc) == 0 { - continue - } - weatherDesc[0] = langs[0] - } - } - } - } - } - var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(rv); err != nil { - return err - } else { - if err = json.NewDecoder(&buf).Decode(r); err != nil { - return err - } - } - return nil -} - -func getDataFromAPI() (ret resp) { - var params []string - - if len(config.APIKey) == 0 { - log.Fatal("No API key specified. Setup instructions are in the README.") - } - params = append(params, "key="+config.APIKey) - - // non-flag shortcut arguments will overwrite possible flag arguments - for _, arg := range flag.Args() { - if v, err := strconv.Atoi(arg); err == nil && len(arg) == 1 { - config.Numdays = v - } else { - config.City = arg - } - } - - if len(config.City) > 0 { - params = append(params, "q="+url.QueryEscape(config.City)) - } - params = append(params, "format=json") - params = append(params, "num_of_days="+strconv.Itoa(config.Numdays)) - params = append(params, "tp=3") - if config.Lang != "" { - params = append(params, "lang="+config.Lang) - } - - if debug { - fmt.Fprintln(os.Stderr, params) - } - - res, err := http.Get(wuri + strings.Join(params, "&")) - if err != nil { - log.Fatal(err) - } - defer res.Body.Close() - body, err := ioutil.ReadAll(res.Body) - if err != nil { - log.Fatal(err) - } - - if debug { - var out bytes.Buffer - json.Indent(&out, body, "", " ") - out.WriteTo(os.Stderr) - fmt.Println("\n") - } - - if config.Lang == "" { - if err = json.Unmarshal(body, &ret); err != nil { - log.Println(err) - } - } else { - if err = unmarshalLang(body, &ret); err != nil { - log.Println(err) - } - } - return -} - -func init() { - flag.IntVar(&config.Numdays, "days", 3, "Number of days of weather forecast to be displayed") - flag.StringVar(&config.Lang, "lang", "en", "Language of the report") - flag.StringVar(&config.City, "city", "New York", "City to be queried") - flag.BoolVar(&debug, "debug", false, "Print out raw json response for debugging purposes") - flag.BoolVar(&config.Imperial, "imperial", false, "Use imperial units") - flag.BoolVar(&config.Inverse, "inverse", false, "Use inverted colors") - flag.BoolVar(&config.Narrow, "narrow", false, "Narrow output (two columns)") - flag.StringVar(&config.LocationName, "location_name", "", "Location name (used in the caption)") - flag.BoolVar(&config.WindMS, "wind_in_ms", false, "Show wind speed in m/s") - flag.BoolVar(&config.RightToLeft, "right_to_left", false, "Right to left script") - configpath = os.Getenv("WEGORC") - if configpath == "" { - usr, err := user.Current() - if err != nil { - log.Fatalf("%v\nYou can set the environment variable WEGORC to point to your config file as a workaround.", err) - } - configpath = path.Join(usr.HomeDir, ".wegorc") - } - config.APIKey = "" - config.Imperial = false - config.Lang = "en" - err := configload() - if _, ok := err.(*os.PathError); ok { - log.Printf("No config file found. Creating %s ...", configpath) - if err2 := configsave(); err2 != nil { - log.Fatal(err2) - } - } else if err != nil { - log.Fatalf("could not parse %v: %v", configpath, err) - } - - ansiEsc = regexp.MustCompile("\033.*?m") -} - -func main() { - flag.Parse() - - r := getDataFromAPI() - - if r.Data.Req == nil || len(r.Data.Req) < 1 { - if r.Data.Err != nil && len(r.Data.Err) >= 1 { - log.Fatal(r.Data.Err[0].Msg) - } - log.Fatal("Malformed response.") - } - locationName := r.Data.Req[0].Query - if config.LocationName != "" { - locationName = config.LocationName - } - if config.Lang == "he" || config.Lang == "ar" || config.Lang == "fa" { - config.RightToLeft = true - } - if caption, ok := localizedCaption[config.Lang]; !ok { - // r.Data.Req[0].Type, - fmt.Printf("Weather report: %s\n\n", locationName) - } else { - if config.RightToLeft { - caption = locationName + " " + caption - space := strings.Repeat(" ", 125-runewidth.StringWidth(caption)) - fmt.Printf("%s%s\n\n", space, caption) - } else { - fmt.Printf("%s %s\n\n", caption, locationName) - } - } - stdout := colorable.NewColorableStdout() - - if r.Data.Cur == nil || len(r.Data.Cur) < 1 { - log.Fatal("No weather data available.") - } - out := formatCond(make([]string, 5), r.Data.Cur[0], true) - for _, val := range out { - if config.RightToLeft { - fmt.Fprint(stdout, strings.Repeat(" ", 94)) - } else { - fmt.Fprint(stdout, " ") - } - fmt.Fprintln(stdout, val) - } - - if config.Numdays == 0 { - return - } - if r.Data.Weather == nil { - log.Fatal("No detailed weather forecast available.") - } - for _, d := range r.Data.Weather { - for _, val := range printDay(d) { - fmt.Fprintln(stdout, val) - } - } -} diff --git a/legacy/test/proxy-data/data1 b/legacy/test/proxy-data/data1 deleted file mode 100644 index 8e1f651..0000000 --- a/legacy/test/proxy-data/data1 +++ /dev/null @@ -1 +0,0 @@ -{"data":{"request":[{"type":"LatLon","query":"Lat 27.64 and Lon -80.40"}],"nearest_area":[{"areaName":[{"value":"Vero Beach"}],"country":[{"value":"United States of America"}],"region":[{"value":"Florida"}],"latitude":"27.638","longitude":"-80.398","population":"17262","weatherUrl":[{"value":"https://www.worldweatheronline.com/v2/weather.aspx?q=27.6387163,-80.3975399"}]}],"current_condition":[{"observation_time":"10:24 AM","localObsDateTime":"2020-04-26 06:24 AM","temp_C":"22","temp_F":"72","weatherCode":"143","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0006_mist.png"}],"weatherDesc":[{"value":"Mist"}],"windspeedMiles":"4","windspeedKmph":"6","winddirDegree":"240","winddir16Point":"WSW","precipMM":"0.4","humidity":"94","visibility":"10","pressure":"1015","cloudcover":"75","FeelsLikeC":"25","FeelsLikeF":"76","uvIndex":1}],"weather":[{"date":"2020-04-26","astronomy":[{"sunrise":"06:46 AM","sunset":"07:53 PM","moonrise":"09:12 AM","moonset":"11:17 PM","moon_phase":"Waxing Crescent","moon_illumination":"22"}],"maxtempC":"30","maxtempF":"87","mintempC":"23","mintempF":"73","totalSnow_cm":"0.0","sunHour":"6.5","uvIndex":"9","hourly":[{"time":"0","tempC":"25","tempF":"77","windspeedMiles":"7","windspeedKmph":"12","winddirDegree":"235","winddir16Point":"SW","weatherCode":"176","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0025_light_rain_showers_night.png"}],"weatherDesc":[{"value":"Patchy rain possible"}],"precipMM":"0.4","humidity":"85","visibility":"9","pressure":"1015","cloudcover":"86","HeatIndexC":"28","HeatIndexF":"82","DewPointC":"22","DewPointF":"72","WindChillC":"25","WindChillF":"77","WindGustMiles":"14","WindGustKmph":"22","FeelsLikeC":"28","FeelsLikeF":"82","chanceofrain":"76","chanceofremdry":"0","chanceofwindy":"0","chanceofovercast":"89","chanceofsunshine":"0","chanceoffrost":"0","chanceofhightemp":"71","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"},{"time":"300","tempC":"24","tempF":"76","windspeedMiles":"7","windspeedKmph":"12","winddirDegree":"242","winddir16Point":"WSW","weatherCode":"386","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0032_thundery_showers_night.png"}],"weatherDesc":[{"value":"Patchy light rain with thunder"}],"precipMM":"0.4","humidity":"88","visibility":"9","pressure":"1015","cloudcover":"81","HeatIndexC":"27","HeatIndexF":"80","DewPointC":"22","DewPointF":"72","WindChillC":"24","WindChillF":"76","WindGustMiles":"13","WindGustKmph":"21","FeelsLikeC":"27","FeelsLikeF":"80","chanceofrain":"70","chanceofremdry":"0","chanceofwindy":"0","chanceofovercast":"87","chanceofsunshine":"0","chanceoffrost":"0","chanceofhightemp":"13","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"},{"time":"600","tempC":"24","tempF":"75","windspeedMiles":"7","windspeedKmph":"12","winddirDegree":"246","winddir16Point":"WSW","weatherCode":"386","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0032_thundery_showers_night.png"}],"weatherDesc":[{"value":"Patchy light rain with thunder"}],"precipMM":"0.6","humidity":"89","visibility":"10","pressure":"1015","cloudcover":"74","HeatIndexC":"26","HeatIndexF":"79","DewPointC":"22","DewPointF":"72","WindChillC":"24","WindChillF":"75","WindGustMiles":"12","WindGustKmph":"20","FeelsLikeC":"26","FeelsLikeF":"79","chanceofrain":"77","chanceofremdry":"0","chanceofwindy":"0","chanceofovercast":"87","chanceofsunshine":"0","chanceoffrost":"0","chanceofhightemp":"12","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"},{"time":"900","tempC":"26","tempF":"78","windspeedMiles":"7","windspeedKmph":"12","winddirDegree":"246","winddir16Point":"WSW","weatherCode":"386","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0016_thundery_showers.png"}],"weatherDesc":[{"value":"Patchy light rain with thunder"}],"precipMM":"1.1","humidity":"83","visibility":"10","pressure":"1017","cloudcover":"80","HeatIndexC":"28","HeatIndexF":"83","DewPointC":"22","DewPointF":"72","WindChillC":"26","WindChillF":"78","WindGustMiles":"11","WindGustKmph":"17","FeelsLikeC":"28","FeelsLikeF":"83","chanceofrain":"73","chanceofremdry":"0","chanceofwindy":"0","chanceofovercast":"88","chanceofsunshine":"0","chanceoffrost":"0","chanceofhightemp":"42","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"9"},{"time":"1200","tempC":"29","tempF":"84","windspeedMiles":"7","windspeedKmph":"12","winddirDegree":"247","winddir16Point":"WSW","weatherCode":"353","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0009_light_rain_showers.png"}],"weatherDesc":[{"value":"Light rain shower"}],"precipMM":"0.7","humidity":"68","visibility":"10","pressure":"1017","cloudcover":"76","HeatIndexC":"32","HeatIndexF":"90","DewPointC":"22","DewPointF":"72","WindChillC":"29","WindChillF":"84","WindGustMiles":"9","WindGustKmph":"15","FeelsLikeC":"32","FeelsLikeF":"90","chanceofrain":"74","chanceofremdry":"0","chanceofwindy":"0","chanceofovercast":"85","chanceofsunshine":"0","chanceoffrost":"0","chanceofhightemp":"95","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"31","uvIndex":"9"},{"time":"1500","tempC":"30","tempF":"86","windspeedMiles":"7","windspeedKmph":"11","winddirDegree":"259","winddir16Point":"WSW","weatherCode":"386","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0016_thundery_showers.png"}],"weatherDesc":[{"value":"Patchy light rain with thunder"}],"precipMM":"1.0","humidity":"63","visibility":"10","pressure":"1016","cloudcover":"62","HeatIndexC":"33","HeatIndexF":"92","DewPointC":"22","DewPointF":"72","WindChillC":"30","WindChillF":"86","WindGustMiles":"9","WindGustKmph":"14","FeelsLikeC":"33","FeelsLikeF":"92","chanceofrain":"76","chanceofremdry":"0","chanceofwindy":"0","chanceofovercast":"87","chanceofsunshine":"0","chanceoffrost":"0","chanceofhightemp":"96","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"87","uvIndex":"9"},{"time":"1800","tempC":"28","tempF":"82","windspeedMiles":"6","windspeedKmph":"9","winddirDegree":"259","winddir16Point":"WSW","weatherCode":"386","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0016_thundery_showers.png"}],"weatherDesc":[{"value":"Patchy light rain with thunder"}],"precipMM":"1.5","humidity":"70","visibility":"10","pressure":"1015","cloudcover":"72","HeatIndexC":"31","HeatIndexF":"88","DewPointC":"22","DewPointF":"71","WindChillC":"28","WindChillF":"82","WindGustMiles":"9","WindGustKmph":"15","FeelsLikeC":"31","FeelsLikeF":"88","chanceofrain":"72","chanceofremdry":"0","chanceofwindy":"0","chanceofovercast":"86","chanceofsunshine":"0","chanceoffrost":"0","chanceofhightemp":"93","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"48","uvIndex":"9"},{"time":"2100","tempC":"25","tempF":"77","windspeedMiles":"7","windspeedKmph":"11","winddirDegree":"243","winddir16Point":"WSW","weatherCode":"176","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0025_light_rain_showers_night.png"}],"weatherDesc":[{"value":"Patchy rain possible"}],"precipMM":"0.2","humidity":"74","visibility":"10","pressure":"1016","cloudcover":"75","HeatIndexC":"27","HeatIndexF":"81","DewPointC":"20","DewPointF":"68","WindChillC":"25","WindChillF":"77","WindGustMiles":"13","WindGustKmph":"21","FeelsLikeC":"27","FeelsLikeF":"81","chanceofrain":"81","chanceofremdry":"0","chanceofwindy":"0","chanceofovercast":"90","chanceofsunshine":"0","chanceoffrost":"0","chanceofhightemp":"61","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"}]},{"date":"2020-04-27","astronomy":[{"sunrise":"06:45 AM","sunset":"07:54 PM","moonrise":"09:58 AM","moonset":"No moonset","moon_phase":"Waxing Crescent","moon_illumination":"30"}],"maxtempC":"24","maxtempF":"76","mintempC":"19","mintempF":"66","totalSnow_cm":"0.0","sunHour":"11.6","uvIndex":"11","hourly":[{"time":"0","tempC":"22","tempF":"71","windspeedMiles":"11","windspeedKmph":"17","winddirDegree":"304","winddir16Point":"NW","weatherCode":"176","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0025_light_rain_showers_night.png"}],"weatherDesc":[{"value":"Patchy rain possible"}],"precipMM":"0.1","humidity":"67","visibility":"10","pressure":"1018","cloudcover":"72","HeatIndexC":"23","HeatIndexF":"74","DewPointC":"15","DewPointF":"60","WindChillC":"22","WindChillF":"71","WindGustMiles":"19","WindGustKmph":"31","FeelsLikeC":"22","FeelsLikeF":"71","chanceofrain":"77","chanceofremdry":"0","chanceofwindy":"0","chanceofovercast":"92","chanceofsunshine":"0","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"},{"time":"300","tempC":"20","tempF":"67","windspeedMiles":"13","windspeedKmph":"20","winddirDegree":"323","winddir16Point":"NW","weatherCode":"113","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0008_clear_sky_night.png"}],"weatherDesc":[{"value":"Clear"}],"precipMM":"0.1","humidity":"59","visibility":"10","pressure":"1017","cloudcover":"49","HeatIndexC":"20","HeatIndexF":"67","DewPointC":"12","DewPointF":"53","WindChillC":"20","WindChillF":"67","WindGustMiles":"22","WindGustKmph":"36","FeelsLikeC":"20","FeelsLikeF":"67","chanceofrain":"51","chanceofremdry":"30","chanceofwindy":"0","chanceofovercast":"63","chanceofsunshine":"29","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"},{"time":"600","tempC":"19","tempF":"67","windspeedMiles":"15","windspeedKmph":"24","winddirDegree":"340","winddir16Point":"NNW","weatherCode":"116","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0004_black_low_cloud.png"}],"weatherDesc":[{"value":"Partly cloudy"}],"precipMM":"0.0","humidity":"54","visibility":"10","pressure":"1018","cloudcover":"1","HeatIndexC":"19","HeatIndexF":"67","DewPointC":"10","DewPointF":"49","WindChillC":"19","WindChillF":"67","WindGustMiles":"24","WindGustKmph":"39","FeelsLikeC":"19","FeelsLikeF":"67","chanceofrain":"0","chanceofremdry":"88","chanceofwindy":"0","chanceofovercast":"13","chanceofsunshine":"83","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"},{"time":"900","tempC":"20","tempF":"68","windspeedMiles":"14","windspeedKmph":"22","winddirDegree":"339","winddir16Point":"NNW","weatherCode":"113","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png"}],"weatherDesc":[{"value":"Sunny"}],"precipMM":"0.0","humidity":"51","visibility":"10","pressure":"1020","cloudcover":"1","HeatIndexC":"21","HeatIndexF":"69","DewPointC":"9","DewPointF":"49","WindChillC":"20","WindChillF":"68","WindGustMiles":"19","WindGustKmph":"31","FeelsLikeC":"20","FeelsLikeF":"68","chanceofrain":"0","chanceofremdry":"87","chanceofwindy":"0","chanceofovercast":"26","chanceofsunshine":"80","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"11"},{"time":"1200","tempC":"23","tempF":"73","windspeedMiles":"13","windspeedKmph":"21","winddirDegree":"230","winddir16Point":"SW","weatherCode":"113","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png"}],"weatherDesc":[{"value":"Sunny"}],"precipMM":"0.0","humidity":"43","visibility":"10","pressure":"1020","cloudcover":"0","HeatIndexC":"24","HeatIndexF":"76","DewPointC":"9","DewPointF":"49","WindChillC":"23","WindChillF":"73","WindGustMiles":"15","WindGustKmph":"24","FeelsLikeC":"24","FeelsLikeF":"76","chanceofrain":"0","chanceofremdry":"88","chanceofwindy":"0","chanceofovercast":"0","chanceofsunshine":"88","chanceoffrost":"0","chanceofhightemp":"5","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"11"},{"time":"1500","tempC":"24","tempF":"74","windspeedMiles":"12","windspeedKmph":"20","winddirDegree":"12","winddir16Point":"NNE","weatherCode":"113","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png"}],"weatherDesc":[{"value":"Sunny"}],"precipMM":"0.0","humidity":"41","visibility":"10","pressure":"1019","cloudcover":"0","HeatIndexC":"25","HeatIndexF":"76","DewPointC":"10","DewPointF":"49","WindChillC":"24","WindChillF":"74","WindGustMiles":"14","WindGustKmph":"23","FeelsLikeC":"25","FeelsLikeF":"76","chanceofrain":"0","chanceofremdry":"83","chanceofwindy":"0","chanceofovercast":"0","chanceofsunshine":"86","chanceoffrost":"0","chanceofhightemp":"11","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"11"},{"time":"1800","tempC":"22","tempF":"71","windspeedMiles":"13","windspeedKmph":"21","winddirDegree":"33","winddir16Point":"NNE","weatherCode":"113","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png"}],"weatherDesc":[{"value":"Sunny"}],"precipMM":"0.0","humidity":"53","visibility":"10","pressure":"1019","cloudcover":"0","HeatIndexC":"23","HeatIndexF":"74","DewPointC":"12","DewPointF":"53","WindChillC":"22","WindChillF":"71","WindGustMiles":"16","WindGustKmph":"26","FeelsLikeC":"22","FeelsLikeF":"71","chanceofrain":"0","chanceofremdry":"86","chanceofwindy":"0","chanceofovercast":"0","chanceofsunshine":"86","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"11"},{"time":"2100","tempC":"20","tempF":"68","windspeedMiles":"11","windspeedKmph":"17","winddirDegree":"38","winddir16Point":"NE","weatherCode":"113","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0008_clear_sky_night.png"}],"weatherDesc":[{"value":"Clear"}],"precipMM":"0.0","humidity":"60","visibility":"10","pressure":"1020","cloudcover":"0","HeatIndexC":"20","HeatIndexF":"68","DewPointC":"12","DewPointF":"54","WindChillC":"20","WindChillF":"68","WindGustMiles":"18","WindGustKmph":"29","FeelsLikeC":"20","FeelsLikeF":"68","chanceofrain":"0","chanceofremdry":"81","chanceofwindy":"0","chanceofovercast":"0","chanceofsunshine":"88","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"}]},{"date":"2020-04-28","astronomy":[{"sunrise":"06:44 AM","sunset":"07:54 PM","moonrise":"10:50 AM","moonset":"12:13 AM","moon_phase":"Waxing Crescent","moon_illumination":"37"}],"maxtempC":"25","maxtempF":"76","mintempC":"19","mintempF":"67","totalSnow_cm":"0.0","sunHour":"10.3","uvIndex":"9","hourly":[{"time":"0","tempC":"20","tempF":"68","windspeedMiles":"10","windspeedKmph":"16","winddirDegree":"34","winddir16Point":"NNE","weatherCode":"113","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0008_clear_sky_night.png"}],"weatherDesc":[{"value":"Clear"}],"precipMM":"0.0","humidity":"61","visibility":"10","pressure":"1021","cloudcover":"0","HeatIndexC":"20","HeatIndexF":"68","DewPointC":"12","DewPointF":"54","WindChillC":"20","WindChillF":"68","WindGustMiles":"18","WindGustKmph":"28","FeelsLikeC":"20","FeelsLikeF":"68","chanceofrain":"0","chanceofremdry":"82","chanceofwindy":"0","chanceofovercast":"0","chanceofsunshine":"89","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"},{"time":"300","tempC":"20","tempF":"67","windspeedMiles":"9","windspeedKmph":"15","winddirDegree":"35","winddir16Point":"NE","weatherCode":"113","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0008_clear_sky_night.png"}],"weatherDesc":[{"value":"Clear"}],"precipMM":"0.0","humidity":"61","visibility":"10","pressure":"1020","cloudcover":"0","HeatIndexC":"20","HeatIndexF":"67","DewPointC":"12","DewPointF":"53","WindChillC":"20","WindChillF":"67","WindGustMiles":"17","WindGustKmph":"27","FeelsLikeC":"20","FeelsLikeF":"67","chanceofrain":"0","chanceofremdry":"85","chanceofwindy":"0","chanceofovercast":"0","chanceofsunshine":"89","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"},{"time":"600","tempC":"20","tempF":"68","windspeedMiles":"9","windspeedKmph":"14","winddirDegree":"53","winddir16Point":"NE","weatherCode":"116","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0004_black_low_cloud.png"}],"weatherDesc":[{"value":"Partly cloudy"}],"precipMM":"0.0","humidity":"62","visibility":"10","pressure":"1020","cloudcover":"5","HeatIndexC":"20","HeatIndexF":"68","DewPointC":"13","DewPointF":"55","WindChillC":"20","WindChillF":"68","WindGustMiles":"15","WindGustKmph":"25","FeelsLikeC":"20","FeelsLikeF":"68","chanceofrain":"0","chanceofremdry":"86","chanceofwindy":"0","chanceofovercast":"13","chanceofsunshine":"84","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"},{"time":"900","tempC":"22","tempF":"71","windspeedMiles":"10","windspeedKmph":"16","winddirDegree":"69","winddir16Point":"ENE","weatherCode":"116","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png"}],"weatherDesc":[{"value":"Partly cloudy"}],"precipMM":"0.0","humidity":"60","visibility":"10","pressure":"1021","cloudcover":"15","HeatIndexC":"22","HeatIndexF":"72","DewPointC":"14","DewPointF":"57","WindChillC":"22","WindChillF":"71","WindGustMiles":"14","WindGustKmph":"22","FeelsLikeC":"22","FeelsLikeF":"71","chanceofrain":"0","chanceofremdry":"87","chanceofwindy":"0","chanceofovercast":"43","chanceofsunshine":"74","chanceoffrost":"0","chanceofhightemp":"3","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"9"},{"time":"1200","tempC":"24","tempF":"75","windspeedMiles":"12","windspeedKmph":"19","winddirDegree":"77","winddir16Point":"ENE","weatherCode":"119","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0003_white_cloud.png"}],"weatherDesc":[{"value":"Cloudy"}],"precipMM":"0.0","humidity":"53","visibility":"10","pressure":"1022","cloudcover":"37","HeatIndexC":"25","HeatIndexF":"78","DewPointC":"14","DewPointF":"57","WindChillC":"24","WindChillF":"75","WindGustMiles":"14","WindGustKmph":"22","FeelsLikeC":"25","FeelsLikeF":"78","chanceofrain":"0","chanceofremdry":"86","chanceofwindy":"0","chanceofovercast":"63","chanceofsunshine":"56","chanceoffrost":"0","chanceofhightemp":"12","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"9"},{"time":"1500","tempC":"25","tempF":"76","windspeedMiles":"11","windspeedKmph":"18","winddirDegree":"83","winddir16Point":"E","weatherCode":"116","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png"}],"weatherDesc":[{"value":"Partly cloudy"}],"precipMM":"0.0","humidity":"52","visibility":"10","pressure":"1020","cloudcover":"65","HeatIndexC":"26","HeatIndexF":"78","DewPointC":"14","DewPointF":"57","WindChillC":"25","WindChillF":"76","WindGustMiles":"13","WindGustKmph":"21","FeelsLikeC":"26","FeelsLikeF":"78","chanceofrain":"0","chanceofremdry":"86","chanceofwindy":"0","chanceofovercast":"72","chanceofsunshine":"35","chanceoffrost":"0","chanceofhightemp":"15","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"9"},{"time":"1800","tempC":"23","tempF":"74","windspeedMiles":"9","windspeedKmph":"15","winddirDegree":"88","winddir16Point":"E","weatherCode":"116","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png"}],"weatherDesc":[{"value":"Partly cloudy"}],"precipMM":"0.0","humidity":"56","visibility":"10","pressure":"1019","cloudcover":"16","HeatIndexC":"25","HeatIndexF":"77","DewPointC":"14","DewPointF":"57","WindChillC":"23","WindChillF":"74","WindGustMiles":"13","WindGustKmph":"20","FeelsLikeC":"25","FeelsLikeF":"77","chanceofrain":"0","chanceofremdry":"91","chanceofwindy":"0","chanceofovercast":"35","chanceofsunshine":"82","chanceoffrost":"0","chanceofhightemp":"10","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"9"},{"time":"2100","tempC":"22","tempF":"71","windspeedMiles":"8","windspeedKmph":"13","winddirDegree":"90","winddir16Point":"E","weatherCode":"113","weatherIconUrl":[{"value":"http://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0008_clear_sky_night.png"}],"weatherDesc":[{"value":"Clear"}],"precipMM":"0.0","humidity":"61","visibility":"10","pressure":"1020","cloudcover":"6","HeatIndexC":"25","HeatIndexF":"76","DewPointC":"14","DewPointF":"57","WindChillC":"22","WindChillF":"71","WindGustMiles":"14","WindGustKmph":"23","FeelsLikeC":"22","FeelsLikeF":"71","chanceofrain":"0","chanceofremdry":"89","chanceofwindy":"0","chanceofovercast":"28","chanceofsunshine":"84","chanceoffrost":"0","chanceofhightemp":"0","chanceoffog":"0","chanceofsnow":"0","chanceofthunder":"0","uvIndex":"1"}]}]}} \ No newline at end of file diff --git a/legacy/test/proxy-data/data1.headers b/legacy/test/proxy-data/data1.headers deleted file mode 100644 index 9b1ac5b..0000000 --- a/legacy/test/proxy-data/data1.headers +++ /dev/null @@ -1 +0,0 @@ -{"Content-Type": "application/json"} \ No newline at end of file diff --git a/legacy/test/query.sh b/legacy/test/query.sh deleted file mode 100644 index d49d5f4..0000000 --- a/legacy/test/query.sh +++ /dev/null @@ -1,71 +0,0 @@ -queries=( - / - /Kiev - /Kiev.png - /?T - /Киев - /Kiev?2 - "/Kiev?format=1" - "/Kiev?format=2" - "/Kiev?format=3" - "/Kiev?format=4" - "/Kiev?format=v2" - "/Kiev?format=%s" - "/Kiev?format=%S" - "/Kiev?format=%D+%S+%z+%s+%d" - "/:help" - "/Kiev?T" - "/Kiev?p" - "/Kiev?q" - "/Kiev?Q" - "/Kiev_text=no_view=v2.png" - "/Kiev.png?1nqF" - "/Kiev_1nqF.png" -) - -options=$(cat < test-data/signatures -fi - -result_tmp=$(mktemp wttrin-test-XXXXX) - -while read -r -a args -do - for q in "${queries[@]}"; do - signature=$(echo "${args[@]}" "$q" | sha1sum | awk '{print $1}') - curl -ks "${args[@]}" "$server$q" > "$result_tmp" - - result=$(sha1sum "$result_tmp" | awk '{print $1}') - - # this must be moved to the server - # but for the moment we just clean up - # the cache after each call - rm -rf "/wttr.in/cache" - - if grep -Eq "(we are running out of queries|500 Internal Server Error)" "$result_tmp"; then - echo "$q" - fi - - if [[ $UPDATE = yes ]]; then - printf "%s %s %s\\n" "$signature" "$result" "${args[*]} $q" >> test-data/signatures - elif ! grep -q "$signature $result" test-data/signatures; then - echo "FAILED: curl -ks ${args[*]} $server$q" - fi - done -done <<< "${options}" - -rm "$result_tmp" diff --git a/legacy/test/test-data/signatures b/legacy/test/test-data/signatures deleted file mode 100644 index d14dff1..0000000 --- a/legacy/test/test-data/signatures +++ /dev/null @@ -1,88 +0,0 @@ -8f27084b6294ddbe28dbcbf98f798730e8a79289 4ee2dd9cf8f5818902647ff832ef40d690096bf1 / -ae537911bb7b0568f478073e661abee1cb4ff941 d123e570da22dee9798d353c4281cb5a2bdbaeac /Kiev -4dc586807c16020b9f4dbb705326c698bea41665 a186d89e95061a7887c005ffa8bd1e29362de2da /Kiev.png -3db1938bedc0ee0047bf3b043ddaf0aba1912f13 febab92af9526163bc9e502ecd7fa4225345e6f6 /?T -2cc0ba7a57a6342e72fd7142ca18dbb0eae69416 ce7fb7a88cab697f5280ddabf344f0d397888956 /Киев -928142e88da142ea8075cbfe09bfef349e72dbb1 0f86f59a45b4485fea1375ca945503d9abb9a96d /Kiev?2 -4f6f0a16ff415fad1c102c8023c5d8365ef63402 de3b9821d587753149eded5411ec397e7a2000e2 /Kiev?format=1 -c99903b86971ccccfcca4f13e6fca72776b4fbcf f64086e48d84ac6eb440ca080eff28de1470ec30 /Kiev?format=2 -2a0d6cd8d30a84328580611ca6dd6bed1d805a04 da7b79cdff330edc1a7a78fcf2f9c8bf7e432d40 /Kiev?format=3 -4e4e15eeb6a8b6ddb5d00591c4b5e9b74a13e6bc 6a61305ea631fbccb98090c62a96898e8ffa0d75 /Kiev?format=4 -a27d3e4ad7f820124ef57c9299715bc61cb71387 fed12e63dd5fb5e348ee30d94c7231112eca71cd /Kiev?format=v2 -cbe9fc56091b519e6aebcedd9a7541241f4c4cda 2d97c405f1557b822cc86b038aeea40c3eb79d7d /Kiev?format=%s -84b79ec29670254c3570901e4c5db017516e088d 3f26bdbbd5faf7729f87a9cb964d407493e9a0d6 /Kiev?format=%S -8a0111eb7a519adad1210661bbb49f960ba7f95f fe58cbd420cf36a910551a1037f5c4fa19b31074 /Kiev?format=%D+%S+%z+%s+%d -83cc0ef08c24ad7ecc81d1a6cbd693bb06214ece 0ea998c1b53e452a373699ab953ab00e8a2870f0 /:help -310b64f65fc9f66a5142bf6104f4f9b9d5eef0ea b0bd07f0c87aae9464c091ccb955f41ec6973098 /Kiev?T -9bd1b460d4927df24724f45f69bd3132f3de8e04 d001bf6ab36b6c14f98f02fc4500706d7a9f05a8 /Kiev?p -3ee1a25d436799804d7ebd8371d8022fa55a71d7 80f18be012d0471dce9fcd2b500f482bcd635347 /Kiev?q -e0e8e7eca16bfac88503ac6d19a7a6c8b469c0fd d5d070c98237f0dffc82b176039f90a15f03a667 /Kiev?Q -d08d1fa2546fee0717d1eb663cf63cd1505b8885 e380ef1a22f62a7fa1133d0e35d923c8587cb3ed /Kiev_text=no_view=v2.png -b14e89e2c183139495bad5404748b3b6173063d7 ff70b13244929fa3a934e94f99f019c66501ad43 /Kiev.png?1nqF -04e1a945bdde39d646e397e55c096ec46b53a92b ff70b13244929fa3a934e94f99f019c66501ad43 /Kiev_1nqF.png -3e1be80e942a2ea5450c60e1c0ebfb154aca3da1 6a5bdefe64689f4d05128bd62a8118f4f2f52043 -A firefox / -ee6bf0665c2719cda3ec1fbdb80413d821c99b8e 3f9c5091269ece259cce13fc842265019001ed54 -A firefox /Kiev -98ef11678b7fd33425f97eeee70e00cd96206539 a186d89e95061a7887c005ffa8bd1e29362de2da -A firefox /Kiev.png -ecbcf2cb9004a754c4559ce7e92fead68f71721a 2ea6d52a2108a481cbc0f44a881eb88642d68e80 -A firefox /?T -74206d869128383dba2d840b848b90eb376fd851 7c6ce53ff25d91a5f46baa30077b69e0f09f2571 -A firefox /Киев -91b89025b5acd56ca475924e0eb559a9734f3333 dbd49d93eff2b2cf82f7d266f90de950207a0561 -A firefox /Kiev?2 -e6cb82dab95e05167ffbcb90a10d6cb03cd02ec1 de3b9821d587753149eded5411ec397e7a2000e2 -A firefox /Kiev?format=1 -e65bc57e8d1df26c442a9ecf45afee390ff331a3 f64086e48d84ac6eb440ca080eff28de1470ec30 -A firefox /Kiev?format=2 -d743b331d5f4c81bbc8b168ce84a99ab22dc70cf da7b79cdff330edc1a7a78fcf2f9c8bf7e432d40 -A firefox /Kiev?format=3 -bf359ee92690c3a3061542dc6e78cb42ca837412 6a61305ea631fbccb98090c62a96898e8ffa0d75 -A firefox /Kiev?format=4 -cb875772a6610c991b95b3fbfa22fc7192e25843 5367fd6790d55639b1536ec71abf340e5c79ff45 -A firefox /Kiev?format=v2 -91c0076d8e6665c06aab7c7b2326b29718bfeb80 2d97c405f1557b822cc86b038aeea40c3eb79d7d -A firefox /Kiev?format=%s -ae9d7b1ee27eb8201a0726a3e24fe195cf2ae9e4 3f26bdbbd5faf7729f87a9cb964d407493e9a0d6 -A firefox /Kiev?format=%S -e94371697b70bf956b6f9352fad913d716e774e7 fe58cbd420cf36a910551a1037f5c4fa19b31074 -A firefox /Kiev?format=%D+%S+%z+%s+%d -d520af45b491689d53024c696955db8b1e4eaa87 e916b140b1297cf5bea16d92a91260e9dc3e2bc9 -A firefox /:help -6b80492b79a4cc510cb4a9654cb6ff085cdc1943 801d4c6d6837c9604944168a3930dfe05b0e9f5d -A firefox /Kiev?T -e13d7449ce756e55ba3e84e4b7e601b36d0044b6 c5a87804710ab70b8798f56579d276f4ce1806bf -A firefox /Kiev?p -3f6c192a6da5b79ea59ef94e99b9cbf4b0e7ede2 372aca50f441920ad623d62ee8fcde46d609f6f9 -A firefox /Kiev?q -f28ca2a7a47f4859eac7d0307ec7ac67a40e0adf 1b4b66d58bd7e27abeeca45581e686f12fefe76a -A firefox /Kiev?Q -62c5029cf297b1434c57228dc8c8cdfb5e68285d e380ef1a22f62a7fa1133d0e35d923c8587cb3ed -A firefox /Kiev_text=no_view=v2.png -22aa5dc06076b086de776a3c601544b250fef07c ff70b13244929fa3a934e94f99f019c66501ad43 -A firefox /Kiev.png?1nqF -3a00ecab00da83f70c2abf30379c5e79c791e383 ff70b13244929fa3a934e94f99f019c66501ad43 -A firefox /Kiev_1nqF.png -ed573b89ca5522d6ab69dc1686b98b00391076bd 5ce7ea58bf02bff008baa3193b2db498268a244b -H Accept-Language:ru / -b879673f66235bbf1913ff9abc58aff2fb8962d1 00a96a5d83608c2dad7921862bb3f244775f6b19 -H Accept-Language:ru /Kiev -83d99896cf866ecbaa6d2c64c12bd31bc7b35068 92dc07acb93633974eaff19e8c1a99e590e140d9 -H Accept-Language:ru /Kiev.png -9cbb6aa3e0b46e78229a32688db1cced9a44271d b368cc8f39e7a7ced04e3f4e6506e1eb4551e904 -H Accept-Language:ru /?T -095d8d38c667923131801595b903e007b5f902f3 4ede3397f9def696adc7ecf3ffd46a59b8fb25cb -H Accept-Language:ru /Киев -4e6cdfc38c9d9f2436438b345776c42cb8cab8a5 1b00c96a05f9daea8248a8e063d990797be933ad -H Accept-Language:ru /Kiev?2 -b7d8d0f0bb4c38aabac468c9a354bb4e2b401893 de3b9821d587753149eded5411ec397e7a2000e2 -H Accept-Language:ru /Kiev?format=1 -8f3bbfc9be6418e82edacecc54a9f3e9f26b7fbf f64086e48d84ac6eb440ca080eff28de1470ec30 -H Accept-Language:ru /Kiev?format=2 -f1d4178892fd3dc38e9f966112d317859acc9122 da7b79cdff330edc1a7a78fcf2f9c8bf7e432d40 -H Accept-Language:ru /Kiev?format=3 -cf44e154504d9bc2b9b6066bbb0f5d52fc12f13e 6a61305ea631fbccb98090c62a96898e8ffa0d75 -H Accept-Language:ru /Kiev?format=4 -4955c849f67da53203b8c96b15a0bf0a4a471bc6 e2d3509ef7f6c3fc84151f55e1c5eb2f28dfd155 -H Accept-Language:ru /Kiev?format=v2 -e23e33569bbe34de944dad3a647d2a7a525513b4 2d97c405f1557b822cc86b038aeea40c3eb79d7d -H Accept-Language:ru /Kiev?format=%s -d3c44cb57a1ba487b9fe7ec37368d00eee5b4601 3f26bdbbd5faf7729f87a9cb964d407493e9a0d6 -H Accept-Language:ru /Kiev?format=%S -db91cc89883050beedd2afac7c74276a4d2dcf42 fe58cbd420cf36a910551a1037f5c4fa19b31074 -H Accept-Language:ru /Kiev?format=%D+%S+%z+%s+%d -3f69f4a605ce88643b4e0d62a588c92625d41aea 73b4142cd3af43472897989c61408d5765c2a6ef -H Accept-Language:ru /:help -08553ca4bf71c738c4321fe7d84b4e6ff830956f 016fc03b18a8902f838719bbc171184603c08b60 -H Accept-Language:ru /Kiev?T -b70f8b3fc8aee126c04b27b0d3b4c503b4292cbf b60b68a9e77275884812f7e52b06f6012ba5682a -H Accept-Language:ru /Kiev?p -400efdba61125f8cb850d7c33caf4fc2739a960b 5ee4a043a91509ef57aec46a14a0c24f09e8ec47 -H Accept-Language:ru /Kiev?q -b9fd454e73343f262a6d99dd80487495bd647c6f a10718896a07baadb87adf2bf0026b1f00252213 -H Accept-Language:ru /Kiev?Q -8fed034e57624d0e0b33140673094e56e04087bc 83d236565782aff7416bf526b38636148d6ba15a -H Accept-Language:ru /Kiev_text=no_view=v2.png -cf618118ddeff08355620e83a693c40239990545 37a4dd271b5a66513da4a6dc9caeab0ae15814db -H Accept-Language:ru /Kiev.png?1nqF -0f106ea5605ecc852ab6f63eee348a9a954e137f 37a4dd271b5a66513da4a6dc9caeab0ae15814db -H Accept-Language:ru /Kiev_1nqF.png -3ce3dd46413f236244410f142a4b44356a0cedf9 1c2eea391b35c8bfed2541435e1788307aa06bc1 -H X-Forwarded-For:1.1.1.1 / -89be0a5787592298ce34f10b36da7ee87d1a1353 d123e570da22dee9798d353c4281cb5a2bdbaeac -H X-Forwarded-For:1.1.1.1 /Kiev -a9977eadc628b1ede5d4f91ee103dfb740caa2b1 a186d89e95061a7887c005ffa8bd1e29362de2da -H X-Forwarded-For:1.1.1.1 /Kiev.png -eec20c6be5e528967cddf6d0b72c84dbda553d43 9a39dbafa7e1550d374e38059c0f4b8f437e1739 -H X-Forwarded-For:1.1.1.1 /?T -e304153f0e1e9b41781bf4eb6fb6c4a5b7513aec ce7fb7a88cab697f5280ddabf344f0d397888956 -H X-Forwarded-For:1.1.1.1 /Киев -98f0b3a28863a861c6ac6d89ee5d49adb7f3f518 0f86f59a45b4485fea1375ca945503d9abb9a96d -H X-Forwarded-For:1.1.1.1 /Kiev?2 -cf04d7fe2cf36eba8d7fb4fa6def1c9015036456 de3b9821d587753149eded5411ec397e7a2000e2 -H X-Forwarded-For:1.1.1.1 /Kiev?format=1 -67fbe9168566709450eb35d36c60c27105335a7e f64086e48d84ac6eb440ca080eff28de1470ec30 -H X-Forwarded-For:1.1.1.1 /Kiev?format=2 -b2604348bf39774c85b7c18ae7b51f63a2c9f31a da7b79cdff330edc1a7a78fcf2f9c8bf7e432d40 -H X-Forwarded-For:1.1.1.1 /Kiev?format=3 -cf012400156c842e569b6a9f05b094e6b75348cd 6a61305ea631fbccb98090c62a96898e8ffa0d75 -H X-Forwarded-For:1.1.1.1 /Kiev?format=4 -1f4981348cab19df9846cd3b3923ee7a972ff9fa fed12e63dd5fb5e348ee30d94c7231112eca71cd -H X-Forwarded-For:1.1.1.1 /Kiev?format=v2 -e7d772042819bb62e6e259656a75bd7b0621d1da 2d97c405f1557b822cc86b038aeea40c3eb79d7d -H X-Forwarded-For:1.1.1.1 /Kiev?format=%s -7db5a1daac653383c18aec25ad8583f2e5296845 3f26bdbbd5faf7729f87a9cb964d407493e9a0d6 -H X-Forwarded-For:1.1.1.1 /Kiev?format=%S -a9331379fa4b5d61b5a87a8e4cd4412cdae970a1 fe58cbd420cf36a910551a1037f5c4fa19b31074 -H X-Forwarded-For:1.1.1.1 /Kiev?format=%D+%S+%z+%s+%d -767a7407c14049fd77a6a2fedd1d8b35f6e47e0d 0ea998c1b53e452a373699ab953ab00e8a2870f0 -H X-Forwarded-For:1.1.1.1 /:help -10631d55b42e7bc5ec15ffc5cddae712785eb354 b0bd07f0c87aae9464c091ccb955f41ec6973098 -H X-Forwarded-For:1.1.1.1 /Kiev?T -031478f562663eb9f577b04032993e2f098146f6 d001bf6ab36b6c14f98f02fc4500706d7a9f05a8 -H X-Forwarded-For:1.1.1.1 /Kiev?p -e106cd21a6b67196159c2baa023142e3a8859612 80f18be012d0471dce9fcd2b500f482bcd635347 -H X-Forwarded-For:1.1.1.1 /Kiev?q -1a16c9b52ba90cb7ad3dd8902bf41b31a287d49e d5d070c98237f0dffc82b176039f90a15f03a667 -H X-Forwarded-For:1.1.1.1 /Kiev?Q -83bd9cc6a646e44b75524474dd32f0fd1f5c5a39 e380ef1a22f62a7fa1133d0e35d923c8587cb3ed -H X-Forwarded-For:1.1.1.1 /Kiev_text=no_view=v2.png -ac8dabb4d30cf6a6fae626e6fc29a4f2d9df0164 ff70b13244929fa3a934e94f99f019c66501ad43 -H X-Forwarded-For:1.1.1.1 /Kiev.png?1nqF -f0b3c0851a03a9b182ab938fc7f14935bf7af1f0 ff70b13244929fa3a934e94f99f019c66501ad43 -H X-Forwarded-For:1.1.1.1 /Kiev_1nqF.png