trmnl_preview 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -0
- data/README.md +48 -0
- data/db/data/and_x_more.yml +86 -0
- data/db/data/locales/cs.yml +339 -0
- data/db/data/locales/da.yml +339 -0
- data/db/data/locales/de-AT.yml +341 -0
- data/db/data/locales/de.yml +341 -0
- data/db/data/locales/en-AU.yml +79 -0
- data/db/data/locales/en-GB.yml +79 -0
- data/db/data/locales/en.yml +341 -0
- data/db/data/locales/es-ES.yml +341 -0
- data/db/data/locales/fr.yml +339 -0
- data/db/data/locales/he.yml +339 -0
- data/db/data/locales/hu.yml +339 -0
- data/db/data/locales/id.yml +339 -0
- data/db/data/locales/is.yml +339 -0
- data/db/data/locales/it.yml +341 -0
- data/db/data/locales/ja.yml +342 -0
- data/db/data/locales/ko.yml +337 -0
- data/db/data/locales/lt.yml +340 -0
- data/db/data/locales/nl.yml +339 -0
- data/db/data/locales/no.yml +4 -0
- data/db/data/locales/pl.yml +342 -0
- data/db/data/locales/pt-BR.yml +340 -0
- data/db/data/locales/raw.yml +256 -0
- data/db/data/locales/ro.yml +339 -0
- data/db/data/locales/ru.yml +342 -0
- data/db/data/locales/sk.yml +339 -0
- data/db/data/locales/sv.yml +340 -0
- data/db/data/locales/uk.yml +339 -0
- data/db/data/locales/zh-CN.yml +338 -0
- data/db/data/locales/zh-HK.yml +338 -0
- data/lib/trmnlp/app.rb +5 -4
- data/lib/trmnlp/async_callback.rb +75 -0
- data/lib/trmnlp/browser_pool.rb +8 -8
- data/lib/trmnlp/cli.rb +7 -0
- data/lib/trmnlp/commands/serve.rb +3 -0
- data/lib/trmnlp/commands/test.rb +25 -0
- data/lib/trmnlp/config/plugin.rb +52 -12
- data/lib/trmnlp/config/project.rb +23 -10
- data/lib/trmnlp/config.rb +2 -2
- data/lib/trmnlp/context.rb +29 -6
- data/lib/trmnlp/errors.rb +1 -0
- data/lib/trmnlp/firefox_driver.rb +0 -3
- data/lib/trmnlp/framework_version.rb +9 -0
- data/lib/trmnlp/image_quantizer.rb +28 -15
- data/lib/trmnlp/lint/checks/no_custom_filters.rb +27 -0
- data/lib/trmnlp/lint/diagnostic.rb +5 -0
- data/lib/trmnlp/lint/source.rb +6 -0
- data/lib/trmnlp/lint.rb +3 -1
- data/lib/trmnlp/merged_plugin_locals.rb +57 -0
- data/lib/trmnlp/outbound_request.rb +99 -0
- data/lib/trmnlp/paths.rb +15 -8
- data/lib/trmnlp/poller.rb +100 -47
- data/lib/trmnlp/qr_code_intrinsic_size.rb +22 -0
- data/lib/trmnlp/rails_helpers.rb +41 -0
- data/lib/trmnlp/renderer.rb +40 -11
- data/lib/trmnlp/screen_generator.rb +14 -2
- data/lib/trmnlp/screenshot.rb +50 -11
- data/lib/trmnlp/select_field_choices.rb +25 -0
- data/lib/trmnlp/testing/browser.rb +87 -0
- data/lib/trmnlp/testing/certificate_authority.rb +84 -0
- data/lib/trmnlp/testing/device_models.rb +80 -0
- data/lib/trmnlp/testing/frozen_clock.rb +86 -0
- data/lib/trmnlp/testing/inline_stylesheets.rb +41 -0
- data/lib/trmnlp/testing/memory_sampler.rb +44 -0
- data/lib/trmnlp/testing/mock_proxy.rb +124 -0
- data/lib/trmnlp/testing/mock_table.rb +102 -0
- data/lib/trmnlp/testing/node_version.rb +27 -0
- data/lib/trmnlp/testing/plugin.rb +91 -0
- data/lib/trmnlp/testing/report.html.erb +79 -0
- data/lib/trmnlp/testing/report.rb +91 -0
- data/lib/trmnlp/testing/rspec.rb +89 -0
- data/lib/trmnlp/testing/run.rb +150 -0
- data/lib/trmnlp/testing/screen.rb +83 -0
- data/lib/trmnlp/testing/snapshot.rb +55 -0
- data/lib/trmnlp/transform_backend/subprocess.rb +8 -1
- data/lib/trmnlp/transform_pipeline.rb +51 -9
- data/lib/trmnlp/transform_state.rb +51 -0
- data/lib/trmnlp/user_data_assembler.rb +63 -25
- data/lib/trmnlp/version.rb +1 -1
- data/lib/trmnlp/watcher.rb +2 -1
- data/lib/trmnlp/webhook_payload.rb +74 -0
- data/lib/trmnlp/webhook_receiver.rb +78 -0
- data/lib/trmnlp.rb +2 -1
- data/templates/init/.github/workflows/trmnl.yml +33 -2
- data/templates/init/.gitignore +3 -0
- data/templates/init/tests/plugin_spec.rb +32 -0
- data/trmnl_preview.gemspec +6 -0
- data/web/public/index.js +18 -6
- data/web/views/index.erb +7 -0
- data/web/views/render_html.erb +37 -1
- metadata +115 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e31acf7d3493227af9ab7f728969de7c882622102661528186d29dce67ca722a
|
|
4
|
+
data.tar.gz: 29761cde0d07f5a026ff7a0bc3b1342ea6ad924402236296215bb6f8edfc2e29
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c2a64c19c1fcbdd43c49f94e604e4e0f136f46469abf42a96d2c993f9594f2f4ba1801b3c243d71edc97dfc59e1801b882ee288fcc0184cd638e5917abbe1286
|
|
7
|
+
data.tar.gz: 40a4779d9e8694389ee0d087ec03081171a930c72341aee959e2cbea37ca1ef095006a8bc311ab4dd2bf0fd610f682fe5afbb93792c247c2f9f1b4ba7bc884c2
|
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
1
|
|
|
2
2
|
# Changelog
|
|
3
3
|
|
|
4
|
+
## 0.17.0
|
|
5
|
+
|
|
6
|
+
- `trmnlp init` adds a starter `tests/plugin_spec.rb`, and its GitHub workflow gains a `test` job: `trmnlp test --report` in the `trmnl/trmnlp` image (one `TRMNLP_IMAGE` setting picks the tag), the report uploaded, a manual `update_snapshots` run, and the push to TRMNL waiting for lint and tests. (#168)
|
|
7
|
+
- `trmnlp test --report DIR` writes a report of the run: every example with each screen it rendered (the PNG, an outline of every drawn box, the page's problems) and each transform it ran (time, memory, requests), as `DIR/index.html` and `DIR/report.json`. Under GitHub Actions it adds the counts and the failures to the run's summary. (#167)
|
|
8
|
+
- A polling plugin with no polling url runs its transform on empty data, as TRMNL does, instead of warning "config must specify polling_url" and counting it as a failed fetch, which stopped the transform's state being saved. A plugin whose transform fetches everything itself has no polling url. (#166)
|
|
9
|
+
- `trmnlp test` runs a plugin's RSpec files in `tests/` through trmnlp's own pipeline: `trmnl.transform` and `trmnl.render` with fake APIs (the transform's own HTTPS requests included, in any language), a fixed clock (libfaketime, macOS and Linux), saved state, any TRMNL device, Capybara's matchers on what Firefox drew, layout boxes, overflow checks and PNG snapshots. See the README's Testing Plugins section. (#165)
|
|
10
|
+
- A responsive `qr_code` keeps its own size, as on TRMNL. The hosted service gives the SVG a width, a height and `max-width:100%;height:auto` (core's `trmnl_liquid_qr_code_intrinsic_size` initializer), and trmnlp now does the same. Without it, a code in a shrink-to-fit container such as a `flex flex--col` column shrank to the width of its neighbors, or to nothing. (#162)
|
|
11
|
+
- The Framework script loads as a module, as on TRMNL. A module runs after the page is parsed, so a plugin script that calls the Framework straight away now fails locally the way it fails on the device, instead of only on the device. (#163)
|
|
12
|
+
- A transform's `trmnl_state` is not saved when the poll before it failed, as on TRMNL: a state built from an error or an empty response would replace the last good one. The key is still kept out of the rendered data. (#163)
|
|
13
|
+
|
|
14
|
+
## 0.16.0
|
|
15
|
+
|
|
16
|
+
- Webhook posts must wrap their data in `merge_variables`, as TRMNL requires, and `merge_strategy` (`replace`, `deep_merge`, or `stream` with `stream_limit`) works from the body or the query string. A post without the wrapper is refused with TRMNL's message and a 422; a body that is not JSON gets a 400. Before, trmnlp stored the raw body and always answered 200, so a correct post rendered its data under `merge_variables.*`. A post over 5 kB is stored with a warning, since trmnlp cannot know your plan's limit. (#155)
|
|
17
|
+
- Polled and posted data is cached per project, so two plugins no longer share one `data.json`. Data cached by an older trmnlp is not read: a polling plugin polls again on start, and a webhook plugin needs one new post. (#155)
|
|
18
|
+
- A webhook plugin with a transform runs it once, when a post arrives, and stores the result, as TRMNL does; renders no longer run it. A transform's `trmnl_state` comes back as `trmnl.state` on its next run and in the markup, and `trmnl.previous_merge_variables` carries what the last run stored. (#155)
|
|
19
|
+
- `trmnl.plugin_settings` carries the plugin's name as `instance_name`, plus `no_screen_padding` and `data_fetched_utc`; `polling_url` appears only for a polling plugin and is the unrendered url; `polling_headers` is gone. `trmnl.device` carries `orientation` from the picker. The `trmnl` namespace now wins over a `trmnl` key in fetched data, as on TRMNL. (#155, #158)
|
|
20
|
+
- `dark_mode: 'yes'` darkens every render, `trmnlp build` and PNGs included, and a dark render gets the bare `dark-mode` class Framework 1.x inverts on. The default font class is `screen--fonts-trmnl`, the picker's `screen--1x` is dropped, and a theme select adds `screen--theme-*` with the theme's stylesheet on Framework 3.2.0 and later. `window.I18n.andXMore` uses the user's locale. (#155)
|
|
21
|
+
- A select custom field saves what TRMNL saves: "New York" as `new_york`, a `{ Label: value }` option as its value. The editor saved the label, so `{% if units == "metric" %}` matched only on TRMNL. A label already in `.trmnlp.yml` is read as its value. (#158)
|
|
22
|
+
- A custom field's `default` fills a blank value, in the markup and in the polling url, headers and body, and a custom field set to `{{ env.X }}` in `.trmnlp.yml` reaches the markup filled in, as it already did for polling. Polling is skipped with TRMNL's "Plugin is not configured" message while a field the url needs is blank. (#158)
|
|
23
|
+
- Polling follows TRMNL: the url, headers and body render with the `trmnl` namespace; urls split on CR or LF and drop blank lines; a GET sends the polling body as its query string; up to 5 redirects are followed, dropping `Authorization` when the host changes; reads time out after 10 s with one retry; a 429 or 5xx is a failed fetch while a 4xx body still renders; CSV, markdown, a byte order mark and an unlisted content type parse as on TRMNL. A url that resolves to a private address gets a warning, since TRMNL refuses it, but is still fetched. Logs and warnings leave out the query string, which often holds an api key. (#158)
|
|
24
|
+
- Merge variables over 100 kB fail the render with TRMNL's message. A transform stops after 5 s, gets `trmnl.oauth` when an account is connected, keeps the last good output when it fails, and renders nothing from an output that is not an object. (#158)
|
|
25
|
+
- `l_word`, `l_date`, `pluralize` and `number_to_currency` render as on TRMNL in its 29 locales: `pluralize` gave "3 persons", `number_to_currency: "de"` gave `de1,234.50`, and any non-English `l_word` or `l_date` raised. The locale data is copied from trmnl-i18n and rails-i18n into `db/data/locales` by `rake i18n:sync`, so trmnlp needs no Rails gems. (#156)
|
|
26
|
+
- PNG renders follow TRMNL's renderer: a page dithers only when it asks for it with `image-dither`, otherwise it is posterized with TRMNL's ImageMagick steps, and the capture waits for the Framework's ready signals (up to 5 s, 12 s with a map). Highcharts charts rendered blank, since the unversioned CDN url refuses a page with no Referer; they now load TRMNL's 12.3.0 copy. Text is no longer drawn with antialiasing turned off, which brings it closer to TRMNL's own PNGs. (#157)
|
|
27
|
+
- The `async_polling` strategy works locally: `{{ callback_url }}` points at the preview server, and the callback answers as TRMNL does, 410 for a stale or expired request. The `plugin_merge` strategy works too: list each referenced plugin as `<keyname>_<id>: <path to its trmnlp project>` under `merged_plugins` in `.trmnlp.yml`, and the markup gets TRMNL's merged data. (#160)
|
|
28
|
+
- `trmnlp lint` reports a filter that only `custom_filters` in `.trmnlp.yml` defines (`no_custom_filters`). TRMNL does not load those modules and outputs the value unfiltered. (#159)
|
|
29
|
+
|
|
4
30
|
## 0.15.0
|
|
5
31
|
|
|
6
32
|
- `trmnlp lint` names where each finding is: a rule ID such as `[no_opacity]`, then the file, line and column with the source line. Before, it printed only the message, so you had to search every view and Shared for the cause. `trmnlp lint --format json` writes the same report as one JSON object (`version`, `passed`, `issues`) for CI. Exit statuses are unchanged, and the values of unused custom fields in `.trmnlp.yml` are never printed. (#153)
|
data/README.md
CHANGED
|
@@ -119,6 +119,10 @@ including custom properties. HTML/Liquid comments, script strings, text,
|
|
|
119
119
|
`data-*` attributes and `<style>` blocks are excluded from this inline check.
|
|
120
120
|
Liquid in declaration values is counted without rendering the plugin, every branch included.
|
|
121
121
|
|
|
122
|
+
Filters from `custom_filters` in `.trmnlp.yml` exist only in trmnlp. TRMNL does not load them
|
|
123
|
+
and outputs the value unfiltered, so `no_custom_filters` reports each place the markup uses one.
|
|
124
|
+
Filters that trmnl-liquid also provides are not reported.
|
|
125
|
+
|
|
122
126
|
## Building Static Files
|
|
123
127
|
|
|
124
128
|
`trmnlp build` renders every view to a static file under `_build/` — handy for exporting a snapshot or feeding the output into another pipeline. Run it from inside a plugin project:
|
|
@@ -334,8 +338,15 @@ variables:
|
|
|
334
338
|
plugin_settings:
|
|
335
339
|
instance_name: Kevin Bacon Facts
|
|
336
340
|
|
|
341
|
+
# plugin_merge strategy: the plugins this one reads, as "<keyname>_<id>" on TRMNL,
|
|
342
|
+
# each mapped to the trmnlp project whose last fetched data stands in for it
|
|
343
|
+
merged_plugins:
|
|
344
|
+
private_plugin_42: ../weather
|
|
337
345
|
```
|
|
338
346
|
|
|
347
|
+
An `async_polling` plugin gets `{{ callback_url }}` in its polling url. It points at
|
|
348
|
+
`trmnlp serve`'s `/callback` route, where the API posts `merge_variables` after answering 202.
|
|
349
|
+
|
|
339
350
|
## OAuth2
|
|
340
351
|
|
|
341
352
|
This feature is in beta. Please report incorrect behaviour at https://github.com/usetrmnl/trmnlp/issues.
|
|
@@ -459,6 +470,43 @@ The `settings.yml` file is part of the plugin definition, and is uploaded and do
|
|
|
459
470
|
See [TRMNL documentation](https://help.trmnl.com/en/articles/10542599-importing-and-exporting-private-plugins#h_581fb988f0) for details on this file's contents.
|
|
460
471
|
|
|
461
472
|
|
|
473
|
+
|
|
474
|
+
## Testing Plugins
|
|
475
|
+
|
|
476
|
+
`trmnlp init` starts a plugin with `tests/plugin_spec.rb` (each view draws without overflow or page errors, and the transform stays within TRMNL's limits) and a GitHub workflow that runs it in the `trmnl/trmnlp` image, uploads the report, can rewrite the snapshots on a manual run, and pushes to TRMNL only once lint and tests pass. `trmnlp test` runs the RSpec files in your plugin's `tests/` folder, through the same pipeline `serve` and `build` use, with fake APIs and a fixed clock:
|
|
477
|
+
|
|
478
|
+
```ruby
|
|
479
|
+
# tests/weather_spec.rb
|
|
480
|
+
RSpec.describe 'Weather' do
|
|
481
|
+
let(:mocks) { { 'https://api.weather.example/*' => { json: { temp: 12 } } } }
|
|
482
|
+
|
|
483
|
+
%w[og_plus v2].each do |device|
|
|
484
|
+
it "shows the temperature on #{device}" do
|
|
485
|
+
screen = trmnl.render(device:, now: '2030-01-02T08:00:00Z', custom_fields: { city: 'Amsterdam' }, mocks:)
|
|
486
|
+
|
|
487
|
+
expect(screen).to have_text('12°')
|
|
488
|
+
expect(screen).to have_no_overflow
|
|
489
|
+
expect(screen.box('.title').bottom).to be <= screen.box('.content').top
|
|
490
|
+
expect(screen).to match_snapshot
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
it 'keeps its state when the API has nothing new' do
|
|
495
|
+
run = trmnl.transform(state: { etag: 'abc' }, mocks: { 'https://api.weather.example/*' => { status: 304 } })
|
|
496
|
+
|
|
497
|
+
expect(run.state).to eq('etag' => 'abc')
|
|
498
|
+
end
|
|
499
|
+
end
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
- `trmnl.transform(...)` runs the transform and answers `data`, `state`, `requests`, `log`, `error`, `duration_ms` and `max_memory_mb`; `expect(run).to stay_within_serverless_limits` checks TRMNL's 5 seconds and 128 MB. `trmnl.render(view: 'full', ...)` renders a view in Firefox and answers a screen: Capybara's matchers (`have_text`, `have_css`, `within`...) see what is drawn, and `box(selector)`, `evaluate(js)`, `overflowing` and `problems` (script errors, unhandled rejections, `console.error` and files that failed to load; `have_no_problems`) ask the live page; `fresh_browser: true` renders in a new Firefox with nothing cached; `screen.result` holds the run's `data`, `state` and `requests`. `trmnl.plugin(dir)` tests the plugin in another folder, such as a built copy.
|
|
503
|
+
- Inputs, all optional: `device:` (a TRMNL model name, or `{ width:, height:, bit_depth: }`), `palette:`, `orientation: :portrait`, `dark_mode:`, `theme:`, `now:`, `custom_fields:`, `variables:`, `state:`, `previous_merge_variables:`, `data:` (skips polling), `transform: false`. A test's `custom_fields` and `variables` replace those in `.trmnlp.yml`, so development values there never reach a test; the field defaults in `settings.yml` still apply, as on TRMNL.
|
|
504
|
+
- A board drawn by its own script takes `head:` (markup added to the page's `<head>`) and `wait_for:` (a JavaScript expression the page must reach before it is captured, within `wait_for_timeout:` seconds); without it, the capture freezes timers once TRMNL's readiness flags are set.
|
|
505
|
+
- `mocks:` answer every request the run makes: polling urls, and the transform's own requests in any language, HTTPS included. Keys are urls, with `*` wildcards, a Regexp, or a method first (`'POST https://...'`). Values are `{ json:, body:, status:, headers:, delay:, body_delay:, advance_clock:, error: :reset }` (times in seconds: `body_delay:` sends the headers first and the body later, `advance_clock:` moves the transform's clock on when it answers), a string body, a lambda that takes the request, or an array of answers used in order. An unmocked request gets a 599. `requests` lists every request with its `status`, and `aborted: true` for one the transform gave up on before its answer arrived; `duration_ms` is how long the transform ran.
|
|
506
|
+
- `now:` starts every clock: Liquid's, the markup's scripts', and the transform's, through libfaketime (`brew install libfaketime` or `apt-get install libfaketime`; already in the Docker image). On macOS the interpreter must come from brew, mise or similar, since macOS will not hand libfaketime to its own `/usr/bin` binaries.
|
|
507
|
+
- `trmnlp test --report report` also writes `report/index.html` and `report/report.json`: every example with each screen it rendered (with a switch that outlines every drawn box, and the page's problems) and each transform it ran (time, memory, requests). Under GitHub Actions the counts and failures go to the run's summary too.
|
|
508
|
+
- `match_snapshot` stores a missing snapshot under `tests/snapshots/<os>/` and fails one on CI; `trmnlp test --update` rewrites them. Fonts render differently per operating system, so run tests in the Docker image when CI should share your snapshots. `fit_image_size_limit` checks the PNG against the model's limit.
|
|
509
|
+
|
|
462
510
|
## Development
|
|
463
511
|
|
|
464
512
|
To run trmnlp from a checkout of this repo — handy for trying unreleased changes or contributing:
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Mirrored from trmnl-i18n renders.and_x_more_* (window.I18n.andXMore).
|
|
2
|
+
# Refresh with `rake i18n:sync[trmnl_i18n_path,rails_i18n_path]` — do not edit manually.
|
|
3
|
+
cs:
|
|
4
|
+
- A
|
|
5
|
+
- více
|
|
6
|
+
da:
|
|
7
|
+
- Og
|
|
8
|
+
- mere
|
|
9
|
+
de-AT:
|
|
10
|
+
- und
|
|
11
|
+
- weitere
|
|
12
|
+
de:
|
|
13
|
+
- und
|
|
14
|
+
- weitere
|
|
15
|
+
en:
|
|
16
|
+
- And
|
|
17
|
+
- more
|
|
18
|
+
es-ES:
|
|
19
|
+
- "y"
|
|
20
|
+
- más
|
|
21
|
+
fr:
|
|
22
|
+
- Et
|
|
23
|
+
- de plus
|
|
24
|
+
he:
|
|
25
|
+
- And
|
|
26
|
+
- more
|
|
27
|
+
hu:
|
|
28
|
+
- És
|
|
29
|
+
- további
|
|
30
|
+
id:
|
|
31
|
+
- And
|
|
32
|
+
- more
|
|
33
|
+
is:
|
|
34
|
+
- Og
|
|
35
|
+
- fleiri
|
|
36
|
+
it:
|
|
37
|
+
- e
|
|
38
|
+
- più
|
|
39
|
+
ja:
|
|
40
|
+
- And
|
|
41
|
+
- more
|
|
42
|
+
ko:
|
|
43
|
+
- And
|
|
44
|
+
- 개 더
|
|
45
|
+
lt:
|
|
46
|
+
- Ir dar
|
|
47
|
+
- daugiau
|
|
48
|
+
nl:
|
|
49
|
+
- En nog
|
|
50
|
+
- more
|
|
51
|
+
'no':
|
|
52
|
+
- And
|
|
53
|
+
- more
|
|
54
|
+
pl:
|
|
55
|
+
- i
|
|
56
|
+
- więcej
|
|
57
|
+
pt-BR:
|
|
58
|
+
- E
|
|
59
|
+
- mais
|
|
60
|
+
raw:
|
|
61
|
+
- renders.and_x_more_prefix
|
|
62
|
+
- renders.and_x_more_suffix
|
|
63
|
+
ro:
|
|
64
|
+
- Și
|
|
65
|
+
- mai mult
|
|
66
|
+
ru:
|
|
67
|
+
- И
|
|
68
|
+
- ещё
|
|
69
|
+
sk:
|
|
70
|
+
- A
|
|
71
|
+
- ďalšie
|
|
72
|
+
sl:
|
|
73
|
+
- in še
|
|
74
|
+
- ''
|
|
75
|
+
sv:
|
|
76
|
+
- And
|
|
77
|
+
- more
|
|
78
|
+
uk:
|
|
79
|
+
- And
|
|
80
|
+
- more
|
|
81
|
+
zh-CN:
|
|
82
|
+
- 及其他
|
|
83
|
+
- 项
|
|
84
|
+
zh-HK:
|
|
85
|
+
- 還有
|
|
86
|
+
- 個
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# Mirrored from trmnl-i18n custom_plugins and rails-i18n date, time, number.
|
|
2
|
+
# Refresh with `rake i18n:sync[trmnl_i18n_path,rails_i18n_path]` — do not edit manually.
|
|
3
|
+
cs:
|
|
4
|
+
custom_plugins:
|
|
5
|
+
today: dnes
|
|
6
|
+
tomorrow: zítra
|
|
7
|
+
updated: Aktualizováno
|
|
8
|
+
activity: Aktivita
|
|
9
|
+
done: Hotovo
|
|
10
|
+
due: Termín
|
|
11
|
+
deutsche_bahn_departures:
|
|
12
|
+
departures: Odjezdy
|
|
13
|
+
time: Čas
|
|
14
|
+
line: Linka
|
|
15
|
+
destination: Cíl
|
|
16
|
+
platform: Nástupiště
|
|
17
|
+
delay: Zpoždění
|
|
18
|
+
train: Vlak
|
|
19
|
+
on_time: Na čas
|
|
20
|
+
cancelled: Zrušeno
|
|
21
|
+
minutes: min
|
|
22
|
+
refreshed: Obnoveno
|
|
23
|
+
simple_calendar:
|
|
24
|
+
title: Kalendář
|
|
25
|
+
ym_format: "%B %Y"
|
|
26
|
+
chinese_korean:
|
|
27
|
+
leap_format: Přestupný %{month_label}
|
|
28
|
+
leap_format_short: PM%{alt_month}
|
|
29
|
+
ym_format: ", %{leap_month_label} %{heavenly_stem} %{earthly_branch}"
|
|
30
|
+
month_labels:
|
|
31
|
+
-
|
|
32
|
+
- M1
|
|
33
|
+
- M2
|
|
34
|
+
- M3
|
|
35
|
+
- M4
|
|
36
|
+
- M5
|
|
37
|
+
- M6
|
|
38
|
+
- M7
|
|
39
|
+
- M8
|
|
40
|
+
- M9
|
|
41
|
+
- M10
|
|
42
|
+
- M11
|
|
43
|
+
- M12
|
|
44
|
+
date_labels:
|
|
45
|
+
-
|
|
46
|
+
- '1'
|
|
47
|
+
- '2'
|
|
48
|
+
- '3'
|
|
49
|
+
- '4'
|
|
50
|
+
- '5'
|
|
51
|
+
- '6'
|
|
52
|
+
- '7'
|
|
53
|
+
- '8'
|
|
54
|
+
- '9'
|
|
55
|
+
- '10'
|
|
56
|
+
- '11'
|
|
57
|
+
- '12'
|
|
58
|
+
- '13'
|
|
59
|
+
- '14'
|
|
60
|
+
- '15'
|
|
61
|
+
- '16'
|
|
62
|
+
- '17'
|
|
63
|
+
- '18'
|
|
64
|
+
- '19'
|
|
65
|
+
- '20'
|
|
66
|
+
- '21'
|
|
67
|
+
- '22'
|
|
68
|
+
- '23'
|
|
69
|
+
- '24'
|
|
70
|
+
- '25'
|
|
71
|
+
- '26'
|
|
72
|
+
- '27'
|
|
73
|
+
- '28'
|
|
74
|
+
- '29'
|
|
75
|
+
- '30'
|
|
76
|
+
heavenly_stems:
|
|
77
|
+
- Dřevo
|
|
78
|
+
- Dřevo
|
|
79
|
+
- Oheň
|
|
80
|
+
- Oheň
|
|
81
|
+
- Země
|
|
82
|
+
- Země
|
|
83
|
+
- Kov
|
|
84
|
+
- Kov
|
|
85
|
+
- Voda
|
|
86
|
+
- Voda
|
|
87
|
+
earthly_branches:
|
|
88
|
+
- Krysa
|
|
89
|
+
- Vůl
|
|
90
|
+
- Tygr
|
|
91
|
+
- Králík
|
|
92
|
+
- Drak
|
|
93
|
+
- Had
|
|
94
|
+
- Kůň
|
|
95
|
+
- Koza
|
|
96
|
+
- Opice
|
|
97
|
+
- Kohout
|
|
98
|
+
- Pes
|
|
99
|
+
- Vepř
|
|
100
|
+
zodiac_animals:
|
|
101
|
+
- Rat
|
|
102
|
+
- Ox
|
|
103
|
+
- Tiger
|
|
104
|
+
- Rabbit
|
|
105
|
+
- Dragon
|
|
106
|
+
- Snake
|
|
107
|
+
- Horse
|
|
108
|
+
- Goat
|
|
109
|
+
- Monkey
|
|
110
|
+
- Rooster
|
|
111
|
+
- Dog
|
|
112
|
+
- Pig
|
|
113
|
+
solar_terms:
|
|
114
|
+
- Minor Cold
|
|
115
|
+
- Major Cold
|
|
116
|
+
- Start of Spring
|
|
117
|
+
- Rain Water
|
|
118
|
+
- Awakening of Insects
|
|
119
|
+
- Spring Equinox
|
|
120
|
+
- Pure Brightness
|
|
121
|
+
- Grain Rain
|
|
122
|
+
- Start of Summer
|
|
123
|
+
- Grain Buds
|
|
124
|
+
- Grain in Ear
|
|
125
|
+
- Summer Solstice
|
|
126
|
+
- Minor Heat
|
|
127
|
+
- Major Heat
|
|
128
|
+
- Start of Autumn
|
|
129
|
+
- End of Heat
|
|
130
|
+
- White Dew
|
|
131
|
+
- Autumn Equinox
|
|
132
|
+
- Cold Dew
|
|
133
|
+
- Frost's Descent
|
|
134
|
+
- Start of Winter
|
|
135
|
+
- Minor Snow
|
|
136
|
+
- Major Snow
|
|
137
|
+
- Winter Solstice
|
|
138
|
+
japanese:
|
|
139
|
+
rokuyo_terms:
|
|
140
|
+
- 先勝
|
|
141
|
+
- 友引
|
|
142
|
+
- 先負
|
|
143
|
+
- 仏滅
|
|
144
|
+
- 大安
|
|
145
|
+
- 赤口
|
|
146
|
+
nengo:
|
|
147
|
+
reiwa: Reiwa
|
|
148
|
+
ym_format: "%B %Y (%{nengo} %{alt_year})"
|
|
149
|
+
year_1: '1'
|
|
150
|
+
hebrew:
|
|
151
|
+
ym_format: ", %{month_label} %{alt_year}"
|
|
152
|
+
month_labels:
|
|
153
|
+
- Nisan
|
|
154
|
+
- Ijar
|
|
155
|
+
- Sivan
|
|
156
|
+
- Tamuz
|
|
157
|
+
- Av
|
|
158
|
+
- Elul
|
|
159
|
+
- Tišri
|
|
160
|
+
- Chešvan
|
|
161
|
+
- Kislev
|
|
162
|
+
- Tevet
|
|
163
|
+
- Ševat
|
|
164
|
+
- Adar
|
|
165
|
+
- Adar I
|
|
166
|
+
- Adar II
|
|
167
|
+
month_labels_abbr:
|
|
168
|
+
- Nis
|
|
169
|
+
- Ija
|
|
170
|
+
- Siv
|
|
171
|
+
- Tam
|
|
172
|
+
- Av
|
|
173
|
+
- Elu
|
|
174
|
+
- Tiš
|
|
175
|
+
- Che
|
|
176
|
+
- Kis
|
|
177
|
+
- Tev
|
|
178
|
+
- Šev
|
|
179
|
+
- Ada
|
|
180
|
+
- Ad1
|
|
181
|
+
- Ad2
|
|
182
|
+
hijri:
|
|
183
|
+
ym_format: ", %{month_label} %{alt_year}"
|
|
184
|
+
month_labels:
|
|
185
|
+
-
|
|
186
|
+
- Muharram
|
|
187
|
+
- Safar
|
|
188
|
+
- Rabíʻ I
|
|
189
|
+
- Rabíʻ II
|
|
190
|
+
- Džumádá I
|
|
191
|
+
- Džumádá II
|
|
192
|
+
- Radžab
|
|
193
|
+
- Šaʻbán
|
|
194
|
+
- Ramadán
|
|
195
|
+
- Šawwál
|
|
196
|
+
- Dhú al-ki'da
|
|
197
|
+
- Dhú al-hidždža
|
|
198
|
+
bengali:
|
|
199
|
+
ym_format: ", %{month_label} %{alt_year}"
|
|
200
|
+
month_labels:
|
|
201
|
+
-
|
|
202
|
+
- Boishakh
|
|
203
|
+
- Joishtho
|
|
204
|
+
- Asharh
|
|
205
|
+
- Srabon
|
|
206
|
+
- Bhadro
|
|
207
|
+
- Ashwin
|
|
208
|
+
- Kartika
|
|
209
|
+
- Ogrohayon
|
|
210
|
+
- Poush
|
|
211
|
+
- Magh
|
|
212
|
+
- Falgun
|
|
213
|
+
- Choitro
|
|
214
|
+
indian:
|
|
215
|
+
ym_format: ", %{month_label} %{alt_year}"
|
|
216
|
+
month_labels:
|
|
217
|
+
-
|
|
218
|
+
- Chaitra
|
|
219
|
+
- Vaisakha
|
|
220
|
+
- Jyaistha
|
|
221
|
+
- Asadha
|
|
222
|
+
- Sravana
|
|
223
|
+
- Bhadra
|
|
224
|
+
- Asvina
|
|
225
|
+
- Kartika
|
|
226
|
+
- Agrahayana
|
|
227
|
+
- Pausa
|
|
228
|
+
- Magha
|
|
229
|
+
- Phalguna
|
|
230
|
+
public_recipe_stats:
|
|
231
|
+
connections: ".input {$value :number} .match $value zero {{Žádná připojení}}
|
|
232
|
+
one {{{$value :number} připojení}} * {{{$value :number} připojení}}"
|
|
233
|
+
forks: ".input {$value :number} .match $value zero {{Žádný fork}} one {{{$value
|
|
234
|
+
:number} fork}} * {{{$value :number} forků}}"
|
|
235
|
+
installs: ".input {$value :number} .match $value zero {{Žádná instalace}} one
|
|
236
|
+
{{{$value :number} instalace}} * {{{$value :number} instalací}}"
|
|
237
|
+
and_more: a {$value :number} dalších
|
|
238
|
+
error_keyword_title: "“{$keyword}” neodpovídá žádnému výsledku."
|
|
239
|
+
error_keyword_subtitle: Zkuste vyhledat něco jiného.
|
|
240
|
+
error_new_title: Nebyl nalezen žádný nový recept.
|
|
241
|
+
error_new_subtitle: To by se nemělo stávat.
|
|
242
|
+
error_self_title: Nepublikovali jste žádný recept.
|
|
243
|
+
error_self_subtitle: Jak publikovat svůj první recept, se dozvíte na https://help.trmnl.com/en/articles/9510536-private-plugins
|
|
244
|
+
error_author_id_title: 'Uživatel #{$authorId} nepublikoval žádný recept.'
|
|
245
|
+
error_author_id_subtitle: S tímto ID nebyl nalezen žádný recept.
|
|
246
|
+
error_recipe_ids_title: Nebylo nalezeno žádné ID receptu.
|
|
247
|
+
error_recipe_ids_subtitle: Chcete-li začít, přidejte ID receptu.
|
|
248
|
+
horizontal_world_clock:
|
|
249
|
+
name: Světové hodiny
|
|
250
|
+
language_learning_sentences:
|
|
251
|
+
from_to: Z jazyka {$from :langName} do {$to :langNameList}
|
|
252
|
+
custom_next_holiday:
|
|
253
|
+
next_holiday: Příští svátek
|
|
254
|
+
today_and_next: ".input {$nextDays :number} .match $nextDays one {{ {#mainLabel}Dnes
|
|
255
|
+
je{/mainLabel}{#br/}{#mainValue}{$name}{/mainValue}{#br/}{#subLabel}Zítra
|
|
256
|
+
je {$nextName}.{/subLabel} }}* {{ {#mainLabel}Dnes je{/mainLabel}{#br/}{#mainValue}{$name}{/mainValue}{#br/}{#subLabel}Příští
|
|
257
|
+
svátek je {$nextName} za {$nextDays} dní.{/subLabel} }}"
|
|
258
|
+
today_only: "{#mainLabel}Dnes je{/mainLabel}{#br/}{#mainValue}{$name}{/mainValue}"
|
|
259
|
+
next_only: ".input {$nextDays :number} .match $nextDays one {{ {#mainLabel}Zítra
|
|
260
|
+
je{/mainLabel}{#br/}{#mainValue}{$nextName}{/mainValue} }}* {{ {#mainValue}{$nextDays}{/mainValue}{#mainLabel}
|
|
261
|
+
dní do{/mainLabel}{#br/}{#mainValue}{$nextName}{/mainValue} }}"
|
|
262
|
+
no_holidays: "{#subLabel}Konec přidaných svátků.{/subLabel}"
|
|
263
|
+
sun_chart: Sun Chart
|
|
264
|
+
date:
|
|
265
|
+
abbr_day_names:
|
|
266
|
+
- Ne
|
|
267
|
+
- Po
|
|
268
|
+
- Út
|
|
269
|
+
- St
|
|
270
|
+
- Čt
|
|
271
|
+
- Pá
|
|
272
|
+
- So
|
|
273
|
+
abbr_month_names:
|
|
274
|
+
-
|
|
275
|
+
- Led
|
|
276
|
+
- Úno
|
|
277
|
+
- Bře
|
|
278
|
+
- Dub
|
|
279
|
+
- Kvě
|
|
280
|
+
- Čvn
|
|
281
|
+
- Čvc
|
|
282
|
+
- Srp
|
|
283
|
+
- Zář
|
|
284
|
+
- Říj
|
|
285
|
+
- Lis
|
|
286
|
+
- Pro
|
|
287
|
+
day_names:
|
|
288
|
+
- Neděle
|
|
289
|
+
- Pondělí
|
|
290
|
+
- Úterý
|
|
291
|
+
- Středa
|
|
292
|
+
- Čtvrtek
|
|
293
|
+
- Pátek
|
|
294
|
+
- Sobota
|
|
295
|
+
formats:
|
|
296
|
+
default: "%d. %m. %Y"
|
|
297
|
+
long: "%d. %B %Y"
|
|
298
|
+
short: "%d %b"
|
|
299
|
+
month_names:
|
|
300
|
+
-
|
|
301
|
+
- Leden
|
|
302
|
+
- Únor
|
|
303
|
+
- Březen
|
|
304
|
+
- Duben
|
|
305
|
+
- Květen
|
|
306
|
+
- Červen
|
|
307
|
+
- Červenec
|
|
308
|
+
- Srpen
|
|
309
|
+
- Září
|
|
310
|
+
- Říjen
|
|
311
|
+
- Listopad
|
|
312
|
+
- Prosinec
|
|
313
|
+
order:
|
|
314
|
+
- :day
|
|
315
|
+
- :month
|
|
316
|
+
- :year
|
|
317
|
+
time:
|
|
318
|
+
am: dopoledne
|
|
319
|
+
formats:
|
|
320
|
+
default: "%a %e. %B %Y %H:%M %z"
|
|
321
|
+
long: "%A %e. %B %Y %H:%M"
|
|
322
|
+
short: "%e. %-m. %H:%M"
|
|
323
|
+
pm: odpoledne
|
|
324
|
+
number:
|
|
325
|
+
currency:
|
|
326
|
+
format:
|
|
327
|
+
delimiter: " "
|
|
328
|
+
format: "%n %u"
|
|
329
|
+
precision: 2
|
|
330
|
+
separator: ","
|
|
331
|
+
significant: false
|
|
332
|
+
strip_insignificant_zeros: false
|
|
333
|
+
unit: Kč
|
|
334
|
+
format:
|
|
335
|
+
delimiter: "."
|
|
336
|
+
precision: 3
|
|
337
|
+
separator: ","
|
|
338
|
+
significant: false
|
|
339
|
+
strip_insignificant_zeros: false
|