From 6b9c3fefa165615a96281f31316cf951430f029e Mon Sep 17 00:00:00 2001 From: "Reindl David (IT-PTR-CEN2-SL10)" Date: Fri, 27 Mar 2026 13:59:28 +0100 Subject: [PATCH] various improvements to make release 1 complete --- .gitignore | 4 + README-DEV.md | 121 +- README.md | 103 +- assets/admin.css | 29 + assets/admin.js | 133 +- assets/blocks.css | 72 +- assets/editor-blocks.js | 653 ++++++++ blocks/context/block.json | 2 +- blocks/match-bench/block.json | 12 + blocks/match-events/block.json | 4 +- blocks/match-referees/block.json | 15 + blocks/match-roster/block.json | 5 +- blocks/schedule/block.json | 9 +- blocks/standings/block.json | 2 +- blocks/team-data/block.json | 18 - .../build-distribution.sh | 26 +- dev-scripts/i18n-manage.sh | 522 +++++++ includes/class-swi-foot-admin.php | 50 +- includes/class-swi-foot-api.php | 76 +- includes/class-swi-foot-blocks.php | 152 +- includes/class-swi-foot-rest.php | 93 +- includes/class-swi-foot-shortcodes.php | 353 ++++- languages/swi_foot_matchdata-de_CH.mo | Bin 2674 -> 0 bytes languages/swi_foot_matchdata-de_CH.po | 705 --------- languages/swi_foot_matchdata-de_DE.mo | Bin 0 -> 18174 bytes languages/swi_foot_matchdata-de_DE.po | 1315 +++++++++++++++++ languages/swi_foot_matchdata-en_US.mo | Bin 2546 -> 2524 bytes languages/swi_foot_matchdata-en_US.po | 989 ++++++++++--- languages/swi_foot_matchdata-fr_FR.mo | Bin 2871 -> 19121 bytes languages/swi_foot_matchdata-fr_FR.po | 1169 +++++++++++---- languages/swi_foot_matchdata-it_IT.mo | Bin 0 -> 20322 bytes languages/swi_foot_matchdata-it_IT.po | 1292 ++++++++++++++++ languages/swi_foot_matchdata.pot | 1139 ++++++++++---- readme.txt | 182 +++ src/editor-blocks.js | 235 +-- src/format-shortcode.js | 4 + swiss-football-matchdata.php | 14 + 37 files changed, 7695 insertions(+), 1803 deletions(-) create mode 100644 assets/editor-blocks.js create mode 100644 blocks/match-bench/block.json create mode 100644 blocks/match-referees/block.json delete mode 100644 blocks/team-data/block.json rename build-distribution.sh => dev-scripts/build-distribution.sh (81%) create mode 100755 dev-scripts/i18n-manage.sh delete mode 100644 languages/swi_foot_matchdata-de_CH.mo delete mode 100644 languages/swi_foot_matchdata-de_CH.po create mode 100644 languages/swi_foot_matchdata-de_DE.mo create mode 100644 languages/swi_foot_matchdata-de_DE.po create mode 100644 languages/swi_foot_matchdata-it_IT.mo create mode 100644 languages/swi_foot_matchdata-it_IT.po create mode 100644 readme.txt diff --git a/.gitignore b/.gitignore index 8285c4f..32d1889 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,10 @@ dist/ builds/ *.zip +# Development Documentation +# Internal notes and summaries, not for distribution +dev-docs/ + # Environment Files .env .env.local diff --git a/README-DEV.md b/README-DEV.md index 5769e40..d1b7beb 100644 --- a/README-DEV.md +++ b/README-DEV.md @@ -51,7 +51,6 @@ npm run build This command: - - Runs `wp-scripts build --output-path=assets/build` - Uses the custom `webpack.config.js` to ensure output is named `editor-blocks.js` - Generates additional asset files in `assets/build/` @@ -87,7 +86,7 @@ Press `Ctrl+C` to stop the server. ### Project Structure -``` +```tree swiss-football-matchdata/ ├── src/ │ ├── editor-blocks.js # Main editor block components @@ -97,10 +96,11 @@ swiss-football-matchdata/ ├── blocks/ # Block definitions (metadata) │ ├── context/ │ ├── match-events/ +│ ├── match-bench/ +│ ├── match-referees/ │ ├── match-roster/ │ ├── schedule/ │ ├── standings/ -│ ├── team-data/ │ └── shortcode-inserter/ ├── assets/ │ ├── build/ @@ -130,6 +130,7 @@ swiss-football-matchdata/ ### Block Files Each block is defined in its own directory under `blocks/`: + - `block.json` — Block metadata (name, icon, attributes, supports) - The React component code lives in `src/editor-blocks.js` @@ -141,12 +142,14 @@ Each block is defined in its own directory under `blocks/`: - Update attribute definitions 2. **Test with hot reload**: + ```bash npm run start ``` - - Hard-refresh your WordPress editor page - - Make changes in `src/editor-blocks.js` - - The browser auto-updates (HMR) + +- Hard-refresh your WordPress editor page +- Make changes in `src/editor-blocks.js` +- The browser auto-updates (HMR) 3. **Verify output**: - Insert/edit the block in WordPress @@ -154,6 +157,7 @@ Each block is defined in its own directory under `blocks/`: - Look at page source to verify shortcode is generated correctly 4. **Build for production**: + ```bash npm run build ``` @@ -190,36 +194,107 @@ Translation files include: **Workflow when adding new translatable strings:** -1. Add translation strings to PHP or JavaScript with proper functions: +1. Add translation strings to PHP or JavaScript with proper functions and translator comments: ```php - __('Text to translate', 'swi_foot_matchdata') + /* translators: %s is the API error message */ + __('Error loading data: %s', 'swi_foot_matchdata') + _e('Text to display', 'swi_foot_matchdata') ``` -2. Extract strings to the `.pot` template file: - ```bash - wp i18n make-pot . languages/swi_foot_matchdata.pot - ``` - (Requires WP-CLI installed) + **Important**: Always add `/* translators: ... */` comments above i18n functions with placeholders to clarify their meaning for translators. -3. Update existing `.po` translation files from the new template (done by translators in PoEdit or similar) +2. Extract strings and update translation files using the i18n management script: -4. Generate binary `.mo` files: ```bash - wp i18n make-mo languages/ + ./dev-scripts/i18n-manage.sh extract ``` -5. Commit both `.po` and `.mo` files to git: + This extracts all strings to `languages/swi_foot_matchdata.pot`. + +3. Generate `.po` files for translation: + + ```bash + ./dev-scripts/i18n-manage.sh translate + ``` + + Creates/updates `.po` files for: German (de_DE), French (fr_FR), Italian (it_IT), English (en_US) + +4. Provide `.po` files to translators: + + - Translators edit `languages/swi_foot_matchdata-de_DE.po`, `-fr_FR.po`, `-it_IT.po` + - They can use PoEdit, Crowdin, or any PO file editor + - Translator comments help clarify placeholder meanings + +5. After translations are complete, compile `.mo` files: + + ```bash + ./dev-scripts/i18n-manage.sh build + ``` + + Generates binary `.mo` files from `.po` files. + +6. Commit both `.po` and `.mo` files to git: + ```bash git add languages/*.po languages/*.mo git commit -m "Update translations for [feature/language]" ``` +7. (Optional) Clean up regional variants: + + ```bash + ./dev-scripts/i18n-manage.sh clean + ``` + + Removes regional variants (de_AT, de_CH) to keep only core languages. + **Note**: Editor backup files (`.po~`) are **not** committed (ignored by `.gitignore`). The `.mo` files are essential for distribution — they're included in both git commits and distribution packages so installations work immediately without requiring a build step. +### Complete i18n Workflow with Script + +The `i18n-manage.sh` script automates the entire translation pipeline: + +```bash +# Run complete workflow (extract → translate → build → clean) +./dev-scripts/i18n-manage.sh all +``` + +This is equivalent to running: +```bash +./dev-scripts/i18n-manage.sh extract # Extract strings to .pot +./dev-scripts/i18n-manage.sh translate # Generate .po files for each language +./dev-scripts/i18n-manage.sh build # Compile .po to .mo files +./dev-scripts/i18n-manage.sh clean # Remove regional variants +``` + +**Supported Languages (by default)**: +- de_DE — German +- fr_FR — French +- it_IT — Italian +- en_US — English + +**Script Configuration**: + +Edit `dev-scripts/i18n-manage.sh` lines 39-60 to customize: +- `WP_CLI_CMD` — WordPress CLI command (for Docker or local) +- `LANGUAGES` — Supported language codes +- `REGIONAL_VARIANTS` — Variants to remove during cleanup + +**Best Practices**: + +- Always add translator comments for strings with placeholders +- Use ordered placeholder syntax: `%1$d`, `%2$s` (not just `%d`, `%s`) +- Keep strings complete and translatable (don't break into fragments) +- Commit `.po` and `.mo` files to git along with source changes + +For detailed documentation, see: +- `dev-docs/I18N_QUICK_REFERENCE.md` — Quick start guide +- `dev-docs/I18N_OPTIMIZATIONS.md` — Best practices and examples + ## Testing in Development ### Local WordPress Installation @@ -283,10 +358,11 @@ test -f assets/build/editor-blocks.asset.php && echo "✓ Asset manifest present A convenience bash script is included to automate distribution packaging: ```bash -./build-distribution.sh +./dev-scripts/build-distribution.sh ``` This script: + - Creates a clean working directory - Excludes all development files and dependencies - Includes only files needed for distribution @@ -294,11 +370,13 @@ This script: - Displays summary information **Excluded from the distribution**: + - `node_modules/` (development dependencies) - `src/` (source code for building) - `test/` (test files) - `package.json` / `package-lock.json` - `webpack.config.js` (build config) +- `dev-scripts/` (development scripts) - `README-DEV.md` (developer guide) - `.git`, `.gitignore`, `.DS_Store`, and other system files @@ -360,6 +438,7 @@ unzip -l dist/swiss-football-matchdata.zip | head -30 ### 5. Size Check The distribution ZIP should be reasonable in size: + - **With `assets/build/editor-blocks.js`**: ~150–300 KB - **Typical unzipped size**: ~800 KB–2 MB @@ -440,6 +519,7 @@ jobs: ``` This ensures: + - Every push/PR has a valid build - Missing build artifacts fail visibly - PHP code is syntactically correct @@ -501,7 +581,8 @@ npm start | Install deps | `npm install` | | Build for production | `npm run build` | | Development with hot reload | `npm start` | -| Create distribution ZIP | `./build-distribution.sh` | +| Extract and translate strings | `./dev-scripts/i18n-manage.sh all` | +| Create distribution ZIP | `./dev-scripts/build-distribution.sh` | | Check PHP syntax | `php -l includes/class-swi-foot-blocks.php` | | Fix linting issues | `npx eslint src/ --fix` | @@ -512,6 +593,7 @@ This plugin integrates with the Swiss Football Association Club API. The API str **Swagger UI**: https://stg-club-api-services.football.ch/swagger/index.html This documentation provides: + - All available REST endpoints - Request/response schemas - Authentication requirements @@ -519,6 +601,7 @@ This documentation provides: - Example requests and responses Refer to this documentation when: + - Adding new API integrations - Understanding the data structures used in the plugin - Debugging API-related issues diff --git a/README.md b/README.md index d455359..78be8b5 100644 --- a/README.md +++ b/README.md @@ -35,19 +35,7 @@ This section explains how the plugin's Gutenberg editor blocks are intended to b - Works in any paragraph or text-based block. - The shortcode generates dynamically at render time on the frontend. -#### 2. Team Data Block - -- **Purpose**: Create and insert shortcodes using a guided block interface. -- **How to use**: - 1. Insert the `Swiss Football Team Data` block in your post/page. - 2. Open the Inspector Controls (right sidebar). - 3. Select a team from the dropdown. - 4. Choose what to display (Standings or Match). - 5. If you chose Match, select the specific match. - 6. Save the post — the block generates and saves the appropriate shortcode. -- **Best for**: Users who prefer a visual block interface over toolbars. - -#### 3. Context Provider Block (for scoped data) +#### 2. Context Provider Block (for scoped data) - **Purpose**: Provide shared contextual data (season, club/team selection) for child blocks placed inside it. It saves JSON to the frontend as a `data-swi-foot-context` attribute on the provider's wrapper element. - **How to use**: @@ -56,7 +44,7 @@ This section explains how the plugin's Gutenberg editor blocks are intended to b 3. Drop child blocks inside the Context block — these child blocks will inherit the contextual settings. 4. On save, the provider writes a `data-swi-foot-context` attribute containing a compact JSON string with the configured keys and values. This attribute is used by frontend renderers. -#### 4. Specialized Blocks (Standings, Schedule, Roster, Events) +#### 3. Specialized Blocks (Standings, Schedule, Roster, Events) - **Swiss Football Standings** - Purpose: Display a league standings table for a team. @@ -80,15 +68,76 @@ This section explains how the plugin's Gutenberg editor blocks are intended to b ## Shortcodes -Shortcodes provide additional flexibility where blocks are not desirable. Examples: +Shortcodes provide additional flexibility where blocks are not desirable. + +### Context Inheritance + +Most shortcodes listed below support **context inheritance** from a parent `[swi_foot_context]` block. When a `match_id` or `team_id` is not explicitly provided as a parameter, the shortcode will attempt to use values from the current block context. + +**Example with context:** +```html +[swi_foot_context match_id="12345"] + [swi_foot_events] + [swi_foot_roster side="home"] +[/swi_foot_context] +``` + +**Example without context (explicit parameters required):** +```html +[swi_foot_events match_id="12345"] +[swi_foot_roster match_id="12345" side="home"] +``` + +### Match Display & Elements ```html [swi_foot_match match_id="12345"] [swi_foot_match_home_team match_id="12345"] +[swi_foot_match_away_team match_id="12345"] [swi_foot_match_date match_id="12345" format="d.m.Y"] +[swi_foot_match_time match_id="12345"] +[swi_foot_match_venue match_id="12345"] +[swi_foot_match_score match_id="12345"] +[swi_foot_match_status match_id="12345"] +[swi_foot_match_league match_id="12345"] +[swi_foot_match_round match_id="12345"] ``` -Refer to the original `readme.txt` for a complete list of shortcodes and their parameters. +### Team & Standings + +```html +[swi_foot_standings team_id="42"] +``` + +### Match Roster & Bench + +```html +[swi_foot_roster match_id="12345" side="home|away" starting_squad="true|false" bench="true|false"] +[swi_foot_bench match_id="12345"] +``` + +- `[swi_foot_roster]` — Display players for a match. + - `side="home"` or `side="away"` — Show only one team (defaults to "home"). + - `starting_squad="true|false"` — Include starting squad (defaults to true). + - `bench="true|false"` — Include bench/substitutes (defaults to false). + - Players are distinguished by `assignmentRoleId`: 0 = starting squad, non-zero = bench. + - When both are shown, lists are separated by a horizontal rule. + +- `[swi_foot_bench]` — Display team staff and substitutes. + - Automatically shows both home and away team staff. + - `match_id` required; will auto-populate from context if in a context provider. + +### Match Events & Referees + +```html +[swi_foot_events match_id="12345" event_order="dynamic|newest_first|oldest_first"] +[swi_foot_referees match_id="12345"] +``` + +- `[swi_foot_events]` — Show match events (goals, cards, substitutions, etc.) with configurable sort order. +- `[swi_foot_referees]` — Display match referees with their roles formatted as "Role: Firstname Name" (name in bold). + +Refer to the original `readme.txt` for additional shortcode details and parameters. ## Installation @@ -104,28 +153,6 @@ Refer to the original `readme.txt` for a complete list of shortcodes and their p - **Verein ID / Season ID**: used to scope team/season data. - **Cache Duration**: how long API responses are cached (default is 30 seconds; configurable). -## Developer Notes - -- Block registrations and editor scripts live in: - - [includes/class-swi-foot-blocks.php](includes/class-swi-foot-blocks.php) - - [assets/editor-blocks.js](assets/editor-blocks.js) - - [assets/build/index.js](assets/build/index.js) - -- The editor script includes defensive `safeRegisterBlockType` and `safeRegisterFormatType` wrappers to avoid runtime errors when WordPress' editor APIs are not available. -- Blocks are written to use `apiVersion: 3` and expect modern Gutenberg APIs. - -## Headless / Automated Checks - -For quick verification that the built bundle registers the plugin's blocks and formats, a small Node-based test helper exists at `test/register-check.js`. - -Run it locally with: - -```bash -node test/register-check.js -``` - -This script stubs a minimal `window.wp` environment to confirm that `swi-foot/context` and the inline format are registered by the built bundle. - ## Support For support or bug reports, open an issue in the project's tracker or contact the plugin author. diff --git a/assets/admin.css b/assets/admin.css index 159a4d0..2cb3804 100644 --- a/assets/admin.css +++ b/assets/admin.css @@ -12,6 +12,35 @@ color: #23282d; } +/* Form actions with buttons */ +.swi-foot-form-actions { + display: flex; + gap: 10px; + margin-top: 20px; + margin-bottom: 10px; +} + +.swi-foot-form-actions button { + flex-shrink: 0; +} + +/* Connection status messages */ +#connection-status { + display: inline-block; + margin-left: 15px; + font-weight: 500; + line-height: 1.5; + min-height: 22px; +} + +#connection-status.success { + color: #046b3a; +} + +#connection-status.error { + color: #d63638; +} + /* Teams grid layout */ .swi-foot-teams-grid { display: grid; diff --git a/assets/admin.js b/assets/admin.js index 867da5b..77bf72a 100644 --- a/assets/admin.js +++ b/assets/admin.js @@ -2,6 +2,96 @@ jQuery(document).ready(function($) { 'use strict'; + // Settings form with Save and Test functionality + $('#swi-foot-settings-form').on('submit', function(e) { + var $form = $(this); + var $status = $('#connection-status'); + var action = $('[name="swi_foot_action"]:focus').val() || 'save_only'; + + e.preventDefault(); + + // Get form data + var formData = new FormData($form[0]); + + // Submit form via WordPress options.php + fetch($form.attr('action'), { + method: 'POST', + credentials: 'same-origin', + body: formData + }).then(function(resp) { + // After form saves successfully, test if requested + if (action === 'save_and_test') { + return test_api_connection($status); + } else { + $('

Settings saved!

') + .insertAfter('.wrap h1'); + } + }).catch(function(err) { + $('

Error saving settings: ' + err.message + '

') + .insertAfter('.wrap h1'); + }); + }); + + // Function to test API connection + function test_api_connection($statusElement) { + // Get current field values from form + var apiUrl = $('input[name="swi_foot_api_base_url"]').val(); + var username = $('input[name="swi_foot_api_username"]').val(); + var password = $('input[name="swi_foot_api_password"]').val(); + + // Validate credentials first + if (!username || !password) { + $('

API credentials not configured. Please configure Username and Password.

') + .insertAfter('.wrap h1'); + return; + } + + if (!apiUrl) { + $('

API Base URL not configured.

') + .insertAfter('.wrap h1'); + return; + } + + // Step 1: Check if URL is reachable with a HEAD request + var urlTest = apiUrl.replace(/\/$/, '') + '/'; + fetch(urlTest, { + method: 'HEAD', + credentials: 'same-origin', + mode: 'no-cors' + }).then(function(resp) { + // Step 2: Make actual API call via REST endpoint + return fetch(swi_foot_ajax.rest_url.replace(/\/$/, '') + '/admin/test-connection', { + method: 'POST', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json', + 'X-WP-Nonce': swi_foot_ajax.rest_nonce + }, + body: JSON.stringify({ test: true }) + }); + }).then(function(resp) { + return resp.json(); + }).then(function(response) { + if (response && response.success) { + $('

Settings saved and connection test successful!

') + .insertAfter('.wrap h1'); + } else { + var errorMsg = (response.error || 'Connection failed'); + var details = response.details ? ': ' + response.details : ''; + $('

' + errorMsg + details + '

') + .insertAfter('.wrap h1'); + } + }).catch(function(err) { + $('

API URL not reachable: ' + apiUrl + '

') + .insertAfter('.wrap h1'); + }); + } + + // Handle button clicks to set which action was used + $('button[name="swi_foot_action"]').on('click', function() { + $(this).focus(); + }); + // Refresh teams functionality $('#refresh-teams').on('click', function() { var $button = $(this); @@ -18,13 +108,13 @@ jQuery(document).ready(function($) { return resp.json(); }).then(function(response) { if (response && response.success) { - $status.text('Teams refreshed successfully!').addClass('success'); + $status.text('✓ Teams refreshed successfully!').addClass('success'); setTimeout(function() { location.reload(); }, 1500); } else { - $status.text('Error: ' + (response.error || 'Unknown')).addClass('error'); + $status.text('✗ Error: ' + (response.error || 'Unknown')).addClass('error'); } }).catch(function() { - $status.text('Network error occurred.').addClass('error'); + $status.text('✗ Network error occurred.').addClass('error'); }).finally(function() { $button.prop('disabled', false).text('Refresh Teams List'); }); @@ -48,47 +138,16 @@ jQuery(document).ready(function($) { headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': swi_foot_ajax.rest_nonce } }).then(function(resp) { return resp.json(); }).then(function(response) { if (response && response.success) { - $status.text('Cache cleared successfully!').addClass('success'); + $status.text('✓ Cache cleared successfully!').addClass('success'); setTimeout(function() { location.reload(); }, 1000); } else { - $status.text('Error clearing cache.').addClass('error'); + $status.text('✗ Error clearing cache.').addClass('error'); } }).catch(function() { - $status.text('Error clearing cache.').addClass('error'); + $status.text('✗ Error clearing cache.').addClass('error'); }).finally(function() { $button.prop('disabled', false); }); }); - // Test API connection - $('#test-connection').on('click', function() { - var $button = $(this); - var $status = $('#connection-status'); - - $button.prop('disabled', true).text('Testing...'); - $status.text('').removeClass('success error'); - - fetch(swi_foot_ajax.rest_url.replace(/\/$/, '') + '/admin/test-connection', { - method: 'POST', - credentials: 'same-origin', - headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': swi_foot_ajax.rest_nonce } - }).then(function(resp) { return resp.json(); }).then(function(response) { - if (response && response.success) { - $status.text('Connection successful!').addClass('success'); - } else { - $status.text('Connection failed: ' + (response.error || 'Unknown')).addClass('error'); - } - }).catch(function() { - $status.text('Network error occurred.').addClass('error'); - }).finally(function() { - $button.prop('disabled', false).text('Test API Connection'); - }); - }); - - // Auto-save settings notice - $('form').on('submit', function() { - $('

Settings saved! The plugin will automatically refresh API tokens as needed.

') - .insertAfter('.wrap h1'); - }); - }); diff --git a/assets/blocks.css b/assets/blocks.css index 284e22c..eb4981b 100644 --- a/assets/blocks.css +++ b/assets/blocks.css @@ -143,7 +143,7 @@ font-weight: 600; } -/* Error messages */ +/* Error messages - for configuration/setup issues */ .swi-foot-error { color: #721c24; padding: 12px 16px; @@ -154,6 +154,39 @@ font-weight: 500; } +/* Warning messages - yellow style for "data not yet available" (406) */ +.swi-foot-data-warning { + color: #856404; + padding: 12px 16px; + background-color: #fff3cd; + border: 1px solid #ffeaa7; + border-radius: 6px; + margin: 15px 0; + font-weight: 500; +} + +/* Unavailable data messages - grey style for "no data available" */ +.swi-foot-data-unavailable { + color: #6c757d; + padding: 12px 16px; + background-color: #f8f9fa; + border: 1px solid #dee2e6; + border-radius: 6px; + margin: 15px 0; + font-weight: 500; +} + +/* Notice messages - informational style (deprecated, use data-warning or data-unavailable) */ +.swi-foot-notice { + color: #6c757d; + padding: 12px 16px; + background-color: #f8f9fa; + border: 1px solid #dee2e6; + border-radius: 6px; + margin: 15px 0; + font-weight: 500; +} + /* Responsive design */ @media (max-width: 768px) { .swi-foot-table { @@ -379,3 +412,40 @@ max-height: 80px; } } + +/* Roster and Bench Player Formatting */ + +.swi-foot-position { + color: #6c757d; + font-size: 0.9em; + font-weight: 400; + font-style: italic; +} + +.swi-foot-role { + color: #6c757d; + font-size: 0.9em; + font-weight: 400; + font-style: italic; + margin-left: 4px; +} + +.roster-player-captain { + font-weight: 500; + color: #d4a017; +} + +.swi-foot-captain-badge { + display: inline-block; + background-color: #d4a017; + color: #fff; + width: 24px; + height: 24px; + line-height: 24px; + text-align: center; + border-radius: 50%; + font-weight: 700; + font-size: 12px; + margin-right: 4px; + vertical-align: middle; +} diff --git a/assets/editor-blocks.js b/assets/editor-blocks.js new file mode 100644 index 0000000..5fcbde6 --- /dev/null +++ b/assets/editor-blocks.js @@ -0,0 +1,653 @@ +// Swiss Football Gutenberg Blocks - Refactored User Flow +(function (blocks, element, editor, components, i18n, data) { + 'use strict'; + + const { registerBlockType } = blocks; + const { createElement: el, useState, useEffect } = element; + const { InspectorControls } = editor; + const { PanelBody, SelectControl, TextControl, ToggleControl, Spinner, RangeControl } = components; + const { __ } = i18n; + + // Helper function to make AJAX calls + function makeAjaxCall(action, data = {}) { + return new Promise((resolve, reject) => { + jQuery.post(swiFootEditorData.ajax_url, { + action: action, + nonce: swiFootEditorData.nonce, + ...data + }, function (response) { + if (response && response.success) { + resolve(response); + } else { + reject(response); + } + }).fail(reject); + }); + } + + // Main Swiss Football Block - Refactored Logic + registerBlockType('swi-foot/team-data', { + title: __('Swiss Football Team Data', 'swi_foot_matchdata'), + description: __('Display team standings or match data with guided selection', 'swi_foot_matchdata'), + icon: 'universal-access-alt', + category: 'widgets', + keywords: [ + __('football', 'swi_foot_matchdata'), + __('soccer', 'swi_foot_matchdata'), + __('team', 'swi_foot_matchdata'), + __('swiss', 'swi_foot_matchdata'), + ], + + attributes: { + selectedTeam: { + type: 'string', + default: '' + }, + dataType: { + type: 'string', + default: '' // 'match' or 'stats' + }, + selectedMatch: { + type: 'string', + default: '' + }, + shortcodeType: { + type: 'string', + default: 'match' + }, + format: { + type: 'string', + default: '' + }, + separator: { + type: 'string', + default: ':' + } + }, + + edit: function (props) { + const { attributes, setAttributes } = props; + const { selectedTeam, dataType, selectedMatch, shortcodeType, format, separator } = attributes; + + // State for dynamic data + const [teams, setTeams] = useState([]); + const [matches, setMatches] = useState([]); + const [loadingTeams, setLoadingTeams] = useState(true); + const [loadingMatches, setLoadingMatches] = useState(false); + + // Load teams on component mount + useEffect(() => { + makeAjaxCall('swi_foot_get_teams_for_editor') + .then(response => { + if (response.success && response.data) { + setTeams(response.data); + } + setLoadingTeams(false); + }) + .catch(() => { + setLoadingTeams(false); + }); + }, []); + + // Load matches when team is selected and dataType is 'match' + useEffect(() => { + if (selectedTeam && dataType === 'match') { + setLoadingMatches(true); + makeAjaxCall('swi_foot_get_matches_for_team', { team_id: selectedTeam }) + .then(response => { + if (response.success && response.data) { + setMatches(response.data); + } + setLoadingMatches(false); + }) + .catch(() => { + setLoadingMatches(false); + }); + } else { + setMatches([]); + } + }, [selectedTeam, dataType]); + + // Build shortcode/content preview + let content = ''; + if (selectedTeam && dataType === 'stats') { + content = '[swi_foot_standings team_id="' + selectedTeam + '"]'; + } else if (selectedTeam && dataType === 'match' && selectedMatch) { + if (selectedMatch === 'current') { + content = '[swi_foot_' + shortcodeType + ' team_id="' + selectedTeam + '" show_current="true"'; + } else { + content = '[swi_foot_' + shortcodeType + ' match_id="' + selectedMatch + '"'; + } + + if (format && (shortcodeType === 'match_date' || shortcodeType === 'match_time')) { + content += ' format="' + format + '"'; + } + if (separator !== ':' && shortcodeType === 'match_score') { + content += ' separator="' + separator + '"'; + } + content += ']'; + } + + // Data type options + const dataTypeOptions = [ + { value: '', label: __('Choose what to display...', 'swi_foot_matchdata') }, + { value: 'stats', label: __('Team Statistics (Standings/Ranking)', 'swi_foot_matchdata') }, + { value: 'match', label: __('Match Data', 'swi_foot_matchdata') } + ]; + + // Match data type options + const matchDataOptions = [ + { value: 'match', label: __('Complete Match Information', 'swi_foot_matchdata') }, + { value: 'match_home_team', label: __('Home Team Name Only', 'swi_foot_matchdata') }, + { value: 'match_away_team', label: __('Away Team Name Only', 'swi_foot_matchdata') }, + { value: 'match_date', label: __('Match Date Only', 'swi_foot_matchdata') }, + { value: 'match_time', label: __('Match Time Only', 'swi_foot_matchdata') }, + { value: 'match_venue', label: __('Venue/Location Only', 'swi_foot_matchdata') }, + { value: 'match_score', label: __('Score Only', 'swi_foot_matchdata') }, + { value: 'match_status', label: __('Match Status Only', 'swi_foot_matchdata') }, + { value: 'match_league', label: __('League Name Only', 'swi_foot_matchdata') }, + { value: 'match_round', label: __('Round Number Only', 'swi_foot_matchdata') } + ]; + + return el('div', { className: 'swi-foot-team-data-block' }, + el(InspectorControls, {}, + el(PanelBody, { title: __('Team Selection', 'swi_foot_matchdata') }, + // Step 1: Team selection + loadingTeams ? el(Spinner) : el(SelectControl, { + label: __('1. Select Team', 'swi_foot_matchdata'), + value: selectedTeam, + options: [{ value: '', label: __('Choose a team...', 'swi_foot_matchdata') }].concat( + teams.map(team => ({ + value: team.value, + label: team.label + })) + ), + onChange: function (value) { + setAttributes({ + selectedTeam: value, + dataType: '', // Reset when team changes + selectedMatch: '' + }); + } + }), + + // Step 2: Data type selection (only show if team is selected) + selectedTeam && el(SelectControl, { + label: __('2. What would you like to display?', 'swi_foot_matchdata'), + value: dataType, + options: dataTypeOptions, + onChange: function (value) { + setAttributes({ + dataType: value, + selectedMatch: '' // Reset match when data type changes + }); + } + }) + ), + + // Match-specific settings + dataType === 'match' && el(PanelBody, { title: __('Match Settings', 'swi_foot_matchdata') }, + // Match selection + loadingMatches ? el(Spinner) : el(SelectControl, { + label: __('3. Select Match', 'swi_foot_matchdata'), + value: selectedMatch, + options: [{ value: '', label: __('Choose a match...', 'swi_foot_matchdata') }].concat( + [{ value: 'current', label: __('Current Match (Next upcoming or recent)', 'swi_foot_matchdata') }], + matches.map(match => ({ + value: match.value, + label: match.label + })) + ), + onChange: function (value) { setAttributes({ selectedMatch: value }); } + }), + + // Match data type (what part of match to show) + selectedMatch && el(SelectControl, { + label: __('4. What match information to display?', 'swi_foot_matchdata'), + value: shortcodeType, + options: matchDataOptions, + onChange: function (value) { setAttributes({ shortcodeType: value }); } + }) + ), + + // Advanced options for match data + dataType === 'match' && selectedMatch && el(PanelBody, { title: __('Advanced Options', 'swi_foot_matchdata'), initialOpen: false }, + (shortcodeType === 'match_date' || shortcodeType === 'match_time') && el(SelectControl, { + label: __('Date/Time Format', 'swi_foot_matchdata'), + value: format, + options: shortcodeType === 'match_date' ? [ + { value: '', label: __('Default (WordPress setting)', 'swi_foot_matchdata') }, + { value: 'd.m.Y', label: '31.12.2024 (European)' }, + { value: 'm/d/Y', label: '12/31/2024 (US)' }, + { value: 'F j, Y', label: 'December 31, 2024' }, + { value: 'D, M j', label: 'Tue, Dec 31' } + ] : [ + { value: '', label: __('Default (WordPress setting)', 'swi_foot_matchdata') }, + { value: 'H:i', label: '14:30 (24-hour)' }, + { value: 'g:i A', label: '2:30 PM (12-hour)' }, + { value: 'g:i', label: '2:30 (12-hour no AM/PM)' } + ], + onChange: function (value) { setAttributes({ format: value }); } + }), + + shortcodeType === 'match_score' && el(SelectControl, { + label: __('Score Separator', 'swi_foot_matchdata'), + value: separator, + options: [ + { value: ':', label: '2 : 1 (colon with spaces)' }, + { value: '-', label: '2 - 1 (dash with spaces)' }, + { value: ' vs ', label: '2 vs 1 (versus)' }, + { value: '|', label: '2 | 1 (pipe)' } + ], + onChange: function (value) { setAttributes({ separator: value }); } + }) + ) + ), + + // Main preview area + el('div', { className: 'swi-foot-preview' }, + el('div', { + style: { + padding: '30px', + textAlign: 'center', + background: '#f8f9fa', + border: '2px dashed #ddd', + borderRadius: '8px' + } + }, + el('h4', { style: { marginTop: 0 } }, __('Swiss Football Team Data', 'swi_foot_matchdata')), + + !selectedTeam && el('p', { style: { color: '#666' } }, + __('1. Please select a team to get started', 'swi_foot_matchdata') + ), + + selectedTeam && !dataType && el('p', { style: { color: '#666' } }, + __('2. Please choose what you want to display', 'swi_foot_matchdata') + ), + + selectedTeam && dataType === 'stats' && el('p', { style: { color: '#28a745' } }, + '✓ ' + __('Will display team standings/ranking', 'swi_foot_matchdata') + ), + + selectedTeam && dataType === 'match' && !selectedMatch && el('p', { style: { color: '#666' } }, + __('3. Please select a match', 'swi_foot_matchdata') + ), + + selectedTeam && dataType === 'match' && selectedMatch && el('div', {}, + el('p', { style: { color: '#28a745' } }, + '✓ ' + __('Ready to display match data', 'swi_foot_matchdata') + ), + el('p', { style: { fontSize: '14px', color: '#666' } }, + __('Generated shortcode:', 'swi_foot_matchdata') + ), + el('code', { + style: { + display: 'block', + padding: '10px', + background: '#fff', + border: '1px solid #ddd', + borderRadius: '4px', + fontFamily: 'Monaco, Menlo, monospace', + fontSize: '12px', + wordBreak: 'break-all' + } + }, content) + ) + ) + ) + ); + }, + + save: function (props) { + const { attributes } = props; + const { selectedTeam, dataType, selectedMatch, shortcodeType, format, separator } = attributes; + + // Build shortcode for saving + let shortcode = ''; + if (selectedTeam && dataType === 'stats') { + shortcode = '[swi_foot_standings team_id="' + selectedTeam + '"]'; + } else if (selectedTeam && dataType === 'match' && selectedMatch) { + if (selectedMatch === 'current') { + shortcode = '[swi_foot_' + shortcodeType + ' team_id="' + selectedTeam + '" show_current="true"'; + } else { + shortcode = '[swi_foot_' + shortcodeType + ' match_id="' + selectedMatch + '"'; + } + + if (format && (shortcodeType === 'match_date' || shortcodeType === 'match_time')) { + shortcode += ' format="' + format + '"'; + } + if (separator !== ':' && shortcodeType === 'match_score') { + shortcode += ' separator="' + separator + '"'; + } + shortcode += ']'; + } + + return shortcode; + } + }); + + // Match Roster Block with Side Selector and Bench Option + registerBlockType('swi-foot/match-roster', { + title: __('Swiss Football Match Roster', 'swi_foot_matchdata'), + description: __('Display match roster for home or away team, with optional bench players', 'swi_foot_matchdata'), + icon: 'groups', + category: 'widgets', + keywords: [ + __('roster', 'swi_foot_matchdata'), + __('players', 'swi_foot_matchdata'), + __('lineup', 'swi_foot_matchdata'), + __('team', 'swi_foot_matchdata'), + ], + + attributes: { + selectedTeam: { + type: 'string', + default: '' + }, + selectedMatch: { + type: 'string', + default: '' + }, + side: { + type: 'string', + default: 'home' // home or away + }, + withBench: { + type: 'boolean', + default: false + } + }, + + edit: function (props) { + const { attributes, setAttributes } = props; + const { selectedTeam, selectedMatch, side, withBench } = attributes; + + const [teams, setTeams] = wp.element.useState([]); + const [matches, setMatches] = wp.element.useState([]); + const [loadingTeams, setLoadingTeams] = wp.element.useState(true); + const [loadingMatches, setLoadingMatches] = wp.element.useState(false); + + // Helper AJAX call + function makeAjaxCall(action, data = {}) { + return new Promise((resolve, reject) => { + jQuery.post(swiFootEditorData.ajax_url, { + action: action, + nonce: swiFootEditorData.nonce, + ...data + }, function (response) { + if (response && response.success) { + resolve(response); + } else { + reject(response); + } + }).fail(reject); + }); + } + + // Load teams + wp.element.useEffect(() => { + setLoadingTeams(true); + makeAjaxCall('swi_foot_get_teams_for_editor') + .then(response => { + if (Array.isArray(response.data)) { + setTeams(response.data); + } + setLoadingTeams(false); + }) + .catch(() => setLoadingTeams(false)); + }, []); + + // Load matches when team changes + wp.element.useEffect(() => { + if (selectedTeam) { + setLoadingMatches(true); + makeAjaxCall('swi_foot_get_matches_for_team', { team_id: selectedTeam }) + .then(response => { + if (Array.isArray(response.data)) { + setMatches(response.data); + } + setLoadingMatches(false); + }) + .catch(() => setLoadingMatches(false)); + } + }, [selectedTeam]); + + return el('div', { className: 'swi-foot-roster-block' }, + el(InspectorControls, {}, + el(PanelBody, { title: __('Match Selection', 'swi_foot_matchdata') }, + + // Team selector + loadingTeams ? el(Spinner) : el(SelectControl, { + label: __('Select Team', 'swi_foot_matchdata'), + value: selectedTeam, + options: [{ value: '', label: __('Choose a team...', 'swi_foot_matchdata') }].concat( + teams.map(team => ({ value: team.value, label: team.label })) + ), + onChange: function (value) { + setAttributes({ selectedTeam: value, selectedMatch: '' }); + } + }), + + // Match selector (shows after team is selected) + selectedTeam && (loadingMatches ? el(Spinner) : el(SelectControl, { + label: __('Select Match', 'swi_foot_matchdata'), + value: selectedMatch, + options: [{ value: '', label: __('Choose a match...', 'swi_foot_matchdata') }].concat( + [{ value: 'current', label: __('Current Match', 'swi_foot_matchdata') }], + matches.map(match => ({ value: match.value, label: match.label })) + ), + onChange: function (value) { setAttributes({ selectedMatch: value }); } + })), + + // Side selector (Home/Away) + selectedMatch && el(SelectControl, { + label: __('Select Side', 'swi_foot_matchdata'), + value: side, + options: [ + { value: 'home', label: __('Home Team', 'swi_foot_matchdata') }, + { value: 'away', label: __('Away Team', 'swi_foot_matchdata') } + ], + onChange: function (value) { setAttributes({ side: value }); } + }), + + // Include bench toggle + selectedMatch && el(ToggleControl, { + label: __('Include Bench Players', 'swi_foot_matchdata'), + help: __('When enabled, bench players will also be displayed', 'swi_foot_matchdata'), + checked: withBench, + onChange: function (value) { setAttributes({ withBench: value }); } + }) + ) + ), + + // Block preview + el('div', { + style: { + padding: '30px', + textAlign: 'center', + background: '#f8f9fa', + border: '2px dashed #ddd', + borderRadius: '8px' + } + }, + el('h4', { style: { marginTop: 0 } }, __('Match Roster', 'swi_foot_matchdata')), + (!selectedTeam || !selectedMatch) ? + el('p', { style: { color: '#666' } }, + __('Please select team, match, side, and bench option', 'swi_foot_matchdata') + ) + : + el('p', { style: { color: '#28a745' } }, + '✓ ' + __('Roster will be displayed for ' + side + ' team' + (withBench ? ' (with bench)' : ''), 'swi_foot_matchdata') + ) + ) + ); + }, + + save: function (props) { + const { selectedTeam, selectedMatch, side, withBench } = props.attributes; + if (!selectedTeam || !selectedMatch || !side) return ''; + + let shortcode = '[swi_foot_roster '; + if (selectedMatch === 'current') { + shortcode += 'team_id="' + selectedTeam + '" show_current="true"'; + } else { + shortcode += 'match_id="' + selectedMatch + '"'; + } + shortcode += ' side="' + side + '"'; + if (withBench) { + shortcode += ' with_bench="true"'; + } + shortcode += ']'; + + return shortcode; + } + }); + + // Match Events Block + registerBlockType('swi-foot/match-events', { + title: __('Swiss Football Match Events', 'swi_foot_matchdata'), + description: __('Display live match events with auto-refresh', 'swi_foot_matchdata'), + icon: 'list-view', + category: 'widgets', + keywords: [ + __('events', 'swi_foot_matchdata'), + __('live', 'swi_foot_matchdata'), + __('timeline', 'swi_foot_matchdata'), + __('match', 'swi_foot_matchdata'), + ], + + attributes: { + selectedTeam: { + type: 'string', + default: '' + }, + selectedMatch: { + type: 'string', + default: '' + }, + refreshInterval: { + type: 'number', + default: 30 + } + }, + + edit: function (props) { + const { attributes, setAttributes } = props; + const { selectedTeam, selectedMatch, refreshInterval } = attributes; + + const [teams, setTeams] = useState([]); + const [matches, setMatches] = useState([]); + const [loadingTeams, setLoadingTeams] = useState(true); + const [loadingMatches, setLoadingMatches] = useState(false); + + // Load teams + useEffect(() => { + makeAjaxCall('swi_foot_get_teams_for_editor') + .then(response => { + if (response.success && response.data) { + setTeams(response.data); + } + setLoadingTeams(false); + }) + .catch(() => setLoadingTeams(false)); + }, []); + + // Load matches when team changes + useEffect(() => { + if (selectedTeam) { + setLoadingMatches(true); + makeAjaxCall('swi_foot_get_matches_for_team', { team_id: selectedTeam }) + .then(response => { + if (response.success && response.data) { + setMatches(response.data); + } + setLoadingMatches(false); + }) + .catch(() => setLoadingMatches(false)); + } + }, [selectedTeam]); + + return el('div', { className: 'swi-foot-events-block' }, + el(InspectorControls, {}, + el(PanelBody, { title: __('Match Selection', 'swi_foot_matchdata') }, + loadingTeams ? el(Spinner) : el(SelectControl, { + label: __('Select Team', 'swi_foot_matchdata'), + value: selectedTeam, + options: [{ value: '', label: __('Choose a team...', 'swi_foot_matchdata') }].concat( + teams.map(team => ({ value: team.value, label: team.label })) + ), + onChange: function (value) { + setAttributes({ selectedTeam: value, selectedMatch: '' }); + } + }), + + selectedTeam && (loadingMatches ? el(Spinner) : el(SelectControl, { + label: __('Select Match', 'swi_foot_matchdata'), + value: selectedMatch, + options: [{ value: '', label: __('Choose a match...', 'swi_foot_matchdata') }].concat( + [{ value: 'current', label: __('Current Match', 'swi_foot_matchdata') }], + matches.map(match => ({ value: match.value, label: match.label })) + ), + onChange: function (value) { setAttributes({ selectedMatch: value }); } + })) + ), + + el(PanelBody, { title: __('Auto-Refresh Settings', 'swi_foot_matchdata') }, + el(RangeControl, { + label: __('Refresh Interval (seconds)', 'swi_foot_matchdata'), + value: refreshInterval, + onChange: function (value) { setAttributes({ refreshInterval: value }); }, + min: 10, + max: 300, + step: 10 + }) + ) + ), + + el('div', { + style: { + padding: '30px', + textAlign: 'center', + background: '#f8f9fa', + border: '2px dashed #ddd', + borderRadius: '8px' + } + }, + el('h4', { style: { marginTop: 0 } }, __('Live Match Events', 'swi_foot_matchdata')), + (!selectedTeam || !selectedMatch) ? + el('p', { style: { color: '#666' } }, __('Please select team and match', 'swi_foot_matchdata')) : + el('div', {}, + el('p', { style: { color: '#28a745' } }, '✓ ' + __('Will display live match events', 'swi_foot_matchdata')), + el('p', { style: { fontSize: '12px', color: '#666' } }, + __('Auto-refresh every', 'swi_foot_matchdata') + ' ' + refreshInterval + ' ' + __('seconds', 'swi_foot_matchdata')) + ) + ) + ); + }, + + save: function (props) { + const { attributes } = props; + const { selectedTeam, selectedMatch, refreshInterval } = attributes; + + if (!selectedTeam || !selectedMatch) return ''; + + let shortcode = '[swi_foot_events '; + if (selectedMatch === 'current') { + shortcode += 'team_id="' + selectedTeam + '" show_current="true"'; + } else { + shortcode += 'match_id="' + selectedMatch + '"'; + } + shortcode += ' refresh_interval="' + refreshInterval + '"]'; + + return shortcode; + } + }); + +})( + window.wp.blocks, + window.wp.element, + window.wp.blockEditor, + window.wp.components, + window.wp.i18n, + window.wp.data +); diff --git a/blocks/context/block.json b/blocks/context/block.json index 53a7a81..052723d 100644 --- a/blocks/context/block.json +++ b/blocks/context/block.json @@ -2,7 +2,7 @@ "apiVersion": 3, "name": "swi-foot/context", "title": "Swiss Football Context (container)", - "category": "widgets", + "category": "swi-football", "icon": "admin-site", "description": "Provides a team/season/match context to child blocks. Children will inherit these settings unless they override them.", "providesContext": { diff --git a/blocks/match-bench/block.json b/blocks/match-bench/block.json new file mode 100644 index 0000000..156d18d --- /dev/null +++ b/blocks/match-bench/block.json @@ -0,0 +1,12 @@ +{ + "apiVersion": 3, + "name": "swi-foot/match-bench", + "title": "Swiss Football Match Bench", + "category": "swi-football", + "icon": "clipboard-user", + "description": "Display team staff and substitutes for a match", + "attributes": { + "side": { "type": "string", "default": "home" } + }, + "usesContext": ["swi-foot/context"] +} diff --git a/blocks/match-events/block.json b/blocks/match-events/block.json index 517f3ef..69e5aff 100644 --- a/blocks/match-events/block.json +++ b/blocks/match-events/block.json @@ -2,8 +2,8 @@ "apiVersion": 3, "name": "swi-foot/match-events", "title": "Swiss Football Match Events", - "category": "widgets", - "icon": "list-view", + "category": "swi-football", + "icon": "info", "description": "Live match events with optional auto-refresh.", "attributes": { "selectedTeam": { "type": "string", "default": "" }, diff --git a/blocks/match-referees/block.json b/blocks/match-referees/block.json new file mode 100644 index 0000000..c0958e2 --- /dev/null +++ b/blocks/match-referees/block.json @@ -0,0 +1,15 @@ +{ + "apiVersion": 3, + "name": "swi-foot/match-referees", + "title": "Swiss Football Match Referees", + "category": "swi-football", + "icon": "whistle", + "description": "Display match officials and referees", + "attributes": { + "selectedMatch": { + "type": "string", + "default": "" + } + }, + "usesContext": ["swi-foot/context"] +} diff --git a/blocks/match-roster/block.json b/blocks/match-roster/block.json index 02cb7c3..73c5888 100644 --- a/blocks/match-roster/block.json +++ b/blocks/match-roster/block.json @@ -2,14 +2,15 @@ "apiVersion": 3, "name": "swi-foot/match-roster", "title": "Swiss Football Match Roster", - "category": "widgets", + "category": "swi-football", "icon": "groups", "description": "Display match roster for a selected match and side.", "attributes": { "selectedTeam": { "type": "string", "default": "" }, "selectedMatch": { "type": "string", "default": "" }, "side": { "type": "string", "default": "home" }, - "withBench": { "type": "boolean", "default": false } + "showStartingSquad": { "type": "boolean", "default": true }, + "showBench": { "type": "boolean", "default": false } } , "usesContext": ["swi-foot/context"] diff --git a/blocks/schedule/block.json b/blocks/schedule/block.json index faa240d..96d0295 100644 --- a/blocks/schedule/block.json +++ b/blocks/schedule/block.json @@ -2,8 +2,8 @@ "apiVersion": 3, "name": "swi-foot/schedule", "title": "Swiss Football Schedule", - "category": "widgets", - "icon": "schedule", + "category": "swi-football", + "icon": "calendar", "description": "Display upcoming matches for a team.", "attributes": { "teamId": { @@ -13,6 +13,11 @@ "limit": { "type": "number", "default": 5 + }, + "matchFilter": { + "type": "string", + "default": "all", + "enum": ["all", "home", "away"] } } , diff --git a/blocks/standings/block.json b/blocks/standings/block.json index 1896573..e783408 100644 --- a/blocks/standings/block.json +++ b/blocks/standings/block.json @@ -2,7 +2,7 @@ "apiVersion": 3, "name": "swi-foot/standings", "title": "Swiss Football Standings", - "category": "widgets", + "category": "swi-football", "icon": "analytics", "description": "Display current standings for a team.", "attributes": { diff --git a/blocks/team-data/block.json b/blocks/team-data/block.json deleted file mode 100644 index 2bb5c00..0000000 --- a/blocks/team-data/block.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "apiVersion": 3, - "name": "swi-foot/team-data", - "title": "Swiss Football Team Data", - "category": "widgets", - "icon": "universal-access-alt", - "description": "Guided team selector to insert shortcodes for various match/team displays.", - "attributes": { - "selectedTeam": { "type": "string", "default": "" }, - "dataType": { "type": "string", "default": "" }, - "selectedMatch": { "type": "string", "default": "" }, - "shortcodeType": { "type": "string", "default": "match" }, - "format": { "type": "string", "default": "" }, - "separator": { "type": "string", "default": ":" } - } - , - "usesContext": ["swi-foot/context"] -} diff --git a/build-distribution.sh b/dev-scripts/build-distribution.sh similarity index 81% rename from build-distribution.sh rename to dev-scripts/build-distribution.sh index f471e31..5d88844 100755 --- a/build-distribution.sh +++ b/dev-scripts/build-distribution.sh @@ -5,8 +5,12 @@ set -e # Exit on error +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PLUGIN_ROOT="$(dirname "$SCRIPT_DIR")" + PLUGIN_NAME="swiss-football-matchdata" -DIST_DIR="dist" +DIST_DIR="$PLUGIN_ROOT/dist" # Colors for output GREEN='\033[0;32m' @@ -19,9 +23,9 @@ echo -e "${BLUE}=== Building Distribution Package ===${NC}" echo "Creating distribution directory..." mkdir -p "$DIST_DIR" -# Check if we're in the plugin root directory -if [ ! -f "package.json" ]; then - echo "Error: package.json not found. Run this script from the plugin root directory." +# Check if plugin root has package.json +if [ ! -f "$PLUGIN_ROOT/package.json" ]; then + echo "Error: package.json not found in $PLUGIN_ROOT" exit 1 fi @@ -31,10 +35,11 @@ rm -rf "$DIST_DIR/$PLUGIN_NAME" "$DIST_DIR/$PLUGIN_NAME.zip" # Copy all plugin files, excluding development artifacts echo "Copying plugin files (excluding development files)..." -rsync -av \ +rsync -av "$PLUGIN_ROOT/" \ --exclude='.git' \ --exclude='node_modules' \ --exclude='.npm-cache' \ + --exclude='package.json' \ --exclude='package-lock.json' \ --exclude='.gitignore' \ --exclude='README-DEV.md' \ @@ -45,9 +50,10 @@ rsync -av \ --exclude='test/' \ --exclude='src/' \ --exclude='webpack.config.js' \ - --exclude='build-distribution.sh' \ + --exclude='dev-scripts/' \ + --exclude='dev-docs/' \ --exclude='dist/' \ - . "$DIST_DIR/$PLUGIN_NAME/" \ + "$DIST_DIR/$PLUGIN_NAME/" \ > /dev/null 2>&1 || true # Verify essential files are present @@ -64,9 +70,7 @@ fi # Create ZIP archive echo "Creating ZIP archive..." -cd "$DIST_DIR" -zip -r -q "$PLUGIN_NAME.zip" "$PLUGIN_NAME/" -cd .. +(cd "$DIST_DIR" && zip -r -q "$PLUGIN_NAME.zip" "$PLUGIN_NAME/") # Get file sizes DIST_SIZE=$(du -sh "$DIST_DIR/$PLUGIN_NAME" | cut -f1) @@ -95,6 +99,8 @@ echo "🚫 Excluded from distribution:" echo " ✗ node_modules/ (development dependencies)" echo " ✗ src/ (source files)" echo " ✗ test/ (test files)" +echo " ✗ dev-scripts/ (scripts for development)" +echo " ✗ dev-docs/ (development documentation)" echo " ✗ package.json / package-lock.json" echo " ✗ webpack.config.js" echo " ✗ README-DEV.md" diff --git a/dev-scripts/i18n-manage.sh b/dev-scripts/i18n-manage.sh new file mode 100755 index 0000000..3cb222f --- /dev/null +++ b/dev-scripts/i18n-manage.sh @@ -0,0 +1,522 @@ +#!/bin/bash + +################################################################################ +# Swiss Football Matchdata - i18n Management Script +# +# Complete i18n workflow using wp-cli: +# 1. Extract strings from PHP/JS to .pot file +# 2. Translate .pot to specified languages +# 3. Generate .mo files from .po files +# 4. Clean up regional language variants +# +# Usage: +# ./dev-scripts/i18n-manage.sh [extract|translate|build|clean|all] +# +# Commands: +# extract - Extract i18n strings and generate .pot file +# translate - Generate .po files for all languages (requires jq) +# build - Generate .mo files from .po files +# clean - Remove regional language variants +# all - Run all steps: extract → translate → build → clean +# +# Configuration: +# Modify the CONFIG section below to match your environment +# +# Dependencies: +# - wp-cli (via docker compose when WP_CLI_WRAPPER is used) +# - jq (for JSON translation data handling) +# - msgfmt (for generating .mo files) +# +################################################################################ + +set -e + +################################################################################ +# CONFIGURATION - Modify these values for your environment +################################################################################ + +# WordPress CLI command wrapper (for docker environments) +# Use local wp-cli: WP_CLI_CMD="wp" +# Use docker compose with working directory: WP_CLI_CMD="docker compose -f ~/Development/wordpress-dev/wp-dev-compose.yml run -w /var/www/html/wp-content/plugins/swiss-football-matchdata --rm wp-cli" +WP_CLI_CMD="docker compose -f ~/Development/wordpress-dev/wp-dev-compose.yml run -w /var/www/html/wp-content/plugins/swiss-football-matchdata --rm wp-cli" + +# Plugin slug +PLUGIN_SLUG="swi_foot_matchdata" + +# Text domain (must match in plugin) +TEXT_DOMAIN="swi_foot_matchdata" + +# Languages to support: language_code:language_name +# Format: LANGUAGE_CODE|LANGUAGE_NAME (space-separated for compatibility) +LANGUAGES="de_DE:German fr_FR:French it_IT:Italian en_US:English" + +# Regional variants to clean up (remove if they exist) +# These will be removed to keep only the main language codes +REGIONAL_VARIANTS=( + "de_AT" # Austrian German + "de_CH" # Swiss German +) + +################################################################################ +# COLORS & OUTPUT +################################################################################ + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' + +log_info() { + echo -e "${BLUE}ℹ${NC} $1" +} + +log_success() { + echo -e "${GREEN}✓${NC} $1" +} + +log_warning() { + echo -e "${YELLOW}⚠${NC} $1" +} + +log_error() { + echo -e "${RED}✗${NC} $1" +} + +log_section() { + echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e "${CYAN} $1${NC}" + echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n" +} + +################################################################################ +# UTILITY FUNCTIONS +################################################################################ + +check_dependencies() { + local missing_deps=0 + + # Check for wp-cli + if ! eval "$WP_CLI_CMD --version" &>/dev/null; then + log_error "wp-cli not found or not accessible via: $WP_CLI_CMD" + missing_deps=1 + fi + + # Check for msgfmt (gettext tools) + if ! command -v msgfmt &>/dev/null; then + log_error "msgfmt not found. Install gettext tools:" + echo " macOS: brew install gettext" + echo " Ubuntu: sudo apt-get install gettext" + missing_deps=1 + fi + + # Check for jq (optional but recommended) + if ! command -v jq &>/dev/null; then + log_warning "jq not installed (optional). Install for better translation support:" + echo " macOS: brew install jq" + echo " Ubuntu: sudo apt-get install jq" + fi + + if [[ $missing_deps -eq 1 ]]; then + return 1 + fi + return 0 +} + +get_language_name() { + local code=$1 + for pair in $LANGUAGES; do + local lang_code="${pair%:*}" + local lang_name="${pair#*:}" + if [[ "$lang_code" == "$code" ]]; then + echo "$lang_name" + return 0 + fi + done + echo "Unknown" +} + +################################################################################ +# EXTRACTION +################################################################################ + +extract_strings() { + log_section "Extracting i18n Strings" + + local pot_file="languages/${PLUGIN_SLUG}.pot" + local exclude_patterns="node_modules,vendor,assets/build,wp-json" + + log_info "Extracting strings to: $pot_file" + + # Create languages directory if it doesn't exist + mkdir -p languages + + # Use wp-cli to extract strings + # Note: wp-cli automatically handles: + # - Translators comments (/* translators: ... */) + # - Multiple placeholders with ordered syntax (%1$d, %2$s, etc.) + # - WordPress i18n functions (__, _e, _x, _n, etc.) + # Syntax: wp i18n make-pot + log_info "Running wp-cli extraction command..." + log_info " Working directory (Docker): /var/www/html/wp-content/plugins/swiss-football-matchdata" + log_info " Plugin directory (local): $(pwd)" + + # Execute the extraction with proper output handling + # WP_CLI_CMD is already configured with -w flag, so . refers to the plugin directory + local extract_output + extract_output=$(eval "$WP_CLI_CMD i18n make-pot --exclude=$exclude_patterns --domain=$TEXT_DOMAIN . languages/${PLUGIN_SLUG}.pot 2>&1" || echo "FAILED") + + # Small delay to ensure file is written + sleep 1 + + # Check if extraction was successful by verifying the file exists + local retries=3 + local pot_exists=0 + + while [[ $retries -gt 0 ]] && [[ $pot_exists -eq 0 ]]; do + if [[ -f "$pot_file" ]]; then + pot_exists=1 + break + fi + + ((retries--)) + if [[ $retries -gt 0 ]]; then + log_warning "Pot file not found yet, retrying... ($retries attempts left)" + sleep 1 + fi + done + + if [[ $pot_exists -eq 1 ]]; then + log_success "Extracted strings to: $pot_file" + + # Show statistics + local string_count=$(grep -c "^msgid \"" "$pot_file" 2>/dev/null || echo "0") + string_count=$(echo "$string_count" | tr -d ' \n') + log_info "Total strings found: $string_count" + + # Check for obsolete entries + local obsolete_count=$(grep -c "^#~" "$pot_file" 2>/dev/null || echo "0") + obsolete_count=$(echo "$obsolete_count" | tr -d ' \n') + if [[ $obsolete_count -gt 0 ]]; then + log_warning "Found $obsolete_count obsolete entries (marked with #~)" + fi + + return 0 + else + log_error "Failed to generate .pot file" + log_error "wp-cli output: $extract_output" + log_error "Checked path: $pot_file (local filesystem)" + log_info "Directory context:" + log_info " • Local plugin dir: $(pwd)" + log_info " • Docker plugin dir: /var/www/html/wp-content/plugins/swiss-football-matchdata" + log_info " • Expected output (local): $(pwd)/languages/${PLUGIN_SLUG}.pot" + log_info "" + log_info "If the file exists in Docker but not locally, verify:" + log_info " 1. Docker volume mounting is correct" + log_info " 2. Run: docker compose -f ~/Development/wordpress-dev/wp-dev-compose.yml exec wp-cli ls -la /var/www/html/wp-content/plugins/swiss-football-matchdata/" + return 1 + fi +} + +################################################################################ +# TRANSLATION +################################################################################ + +translate_strings() { + log_section "Generating .po files from .pot" + + local pot_file="languages/${PLUGIN_SLUG}.pot" + + if [[ ! -f "$pot_file" ]]; then + log_error ".pot file not found: $pot_file" + log_info "Run 'extract' command first" + return 1 + fi + + local created_count=0 + + for pair in $LANGUAGES; do + local lang_code="${pair%:*}" + local lang_name="${pair#*:}" + local po_file="languages/${PLUGIN_SLUG}-${lang_code}.po" + + log_info "Processing: $lang_name ($lang_code)" + + if [[ -f "$po_file" ]]; then + # Update existing .po file + log_info " Updating existing .po file..." + eval "$WP_CLI_CMD i18n update-po languages/${PLUGIN_SLUG}.pot languages/${PLUGIN_SLUG}-${lang_code}.po 2>/dev/null" || true + log_success " Updated: $po_file" + else + # Create new .po file from .pot + log_info " Creating new .po file..." + cp "$pot_file" "$po_file" + + # Update language headers in .po file + sed -i.bak "s/Language: /Language: ${lang_code}/" "$po_file" + rm -f "${po_file}.bak" + + log_success " Created: $po_file" + ((created_count++)) + fi + done + + log_success "Created/Updated $created_count translation files" + return 0 +} + +################################################################################ +# BUILD .MO FILES +################################################################################ + +build_mo_files() { + log_section "Generating .mo files" + + local compiled_count=0 + local errors=0 + + for pair in $LANGUAGES; do + local lang_code="${pair%:*}" + local lang_name="${pair#*:}" + local po_file="languages/${PLUGIN_SLUG}-${lang_code}.po" + local mo_file="languages/${PLUGIN_SLUG}-${lang_code}.mo" + + if [[ -f "$po_file" ]]; then + log_info "Compiling: $lang_name ($lang_code)" + + if msgfmt -o "$mo_file" "$po_file" 2>/dev/null; then + log_success " Generated: $mo_file" + ((compiled_count++)) + else + log_error " Failed to compile: $po_file" + ((errors++)) + fi + else + log_warning " .po file not found: $po_file" + fi + done + + log_success "Compiled $compiled_count .mo files" + + if [[ $errors -gt 0 ]]; then + log_warning "Encountered $errors errors during compilation" + return 1 + fi + return 0 +} + +################################################################################ +# CLEANUP +################################################################################ + +cleanup_regional_variants() { + log_section "Cleaning up regional language variants" + + local removed_count=0 + + for variant in "${REGIONAL_VARIANTS[@]}"; do + # Check for .po files + local po_file="languages/${PLUGIN_SLUG}-${variant}.po" + if [[ -f "$po_file" ]]; then + log_info "Removing: $po_file" + rm -f "$po_file" + ((removed_count++)) + fi + + # Check for .mo files + local mo_file="languages/${PLUGIN_SLUG}-${variant}.mo" + if [[ -f "$mo_file" ]]; then + log_info "Removing: $mo_file" + rm -f "$mo_file" + ((removed_count++)) + fi + + # Also check for backup files created by sed + local po_backup="${po_file}.bak" + if [[ -f "$po_backup" ]]; then + rm -f "$po_backup" + fi + done + + if [[ $removed_count -eq 0 ]]; then + log_info "No regional variants found to remove" + else + log_success "Removed $removed_count regional variant files" + fi + return 0 +} + +################################################################################ +# DISPLAY SUMMARY +################################################################################ + +show_summary() { + log_section "i18n Management Summary" + + echo -e "${YELLOW}📁 Language Files:${NC}\n" + + for pair in $LANGUAGES; do + local lang_code="${pair%:*}" + local lang_name="${pair#*:}" + local po_file="languages/${PLUGIN_SLUG}-${lang_code}.po" + local mo_file="languages/${PLUGIN_SLUG}-${lang_code}.mo" + + printf " %-20s %-20s " "$lang_code" "$lang_name" + + if [[ -f "$po_file" ]] && [[ -f "$mo_file" ]]; then + local po_size=$(du -h "$po_file" | cut -f1) + local mo_size=$(du -h "$mo_file" | cut -f1) + echo -e "${GREEN}✓${NC} PO: $po_size, MO: $mo_size" + elif [[ -f "$po_file" ]]; then + local po_size=$(du -h "$po_file" | cut -f1) + echo -e "${YELLOW}⚠${NC} PO: $po_size (no .mo)" + else + echo -e "${RED}✗${NC} Missing files" + fi + done + + local lang_count=$(echo "$LANGUAGES" | wc -w) + + echo -e "\n${YELLOW}Configuration:${NC}\n" + echo " Plugin slug: $PLUGIN_SLUG" + echo " Text domain: $TEXT_DOMAIN" + echo " Languages: $lang_count" + echo " Languages dir: languages/" + + echo -e "\n${YELLOW}Next Steps:${NC}\n" + echo " • Verify .po files contain all necessary translations" + echo " • Update empty translation entries in .po files" + echo " • Re-run 'build' to regenerate .mo files after translations" + echo "" +} + +################################################################################ +# HELP +################################################################################ + +show_help() { + cat << 'EOF' +Usage: ./dev-scripts/i18n-manage.sh [COMMAND] + +COMMANDS: + extract Extract i18n strings from PHP/JS files to .pot + translate Generate .po files for all configured languages + build Compile .po files to .mo files + clean Remove regional language variants + all Run all steps: extract → translate → build → clean + help Show this help message + +EXAMPLES: + # Extract strings and generate translations + ./dev-scripts/i18n-manage.sh extract + + # Generate .po files for translation + ./dev-scripts/i18n-manage.sh translate + + # Compile .po to .mo files + ./dev-scripts/i18n-manage.sh build + + # Run complete workflow + ./dev-scripts/i18n-manage.sh all + + # Clean up regional variants + ./dev-scripts/i18n-manage.sh clean + +CONFIGURATION: + Edit the script's CONFIG section to adjust: + - WP_CLI_CMD: WordPress CLI command wrapper + - LANGUAGES: Supported language codes + - REGIONAL_VARIANTS: Language variants to remove + +TRANSLATORS COMMENTS: + In PHP code, add translators comments above i18n functions: + + /* translators: %s is the error message from the API */ + __('Error loading teams: %s', 'swi_foot_matchdata') + + For multiple placeholders, use ordered syntax: + + /* translators: %1$d is count, %2$d is duration in seconds */ + __('Currently caching %1$d records with %2$d second duration.', 'swi_foot_matchdata') + +SUPPORTED LANGUAGES (default): + de_DE - German + fr_FR - French + it_IT - Italian + en_US - English (US) + +DEPENDENCIES: + - wp-cli (WordPress CLI) + - msgfmt (gettext tools) + - jq (optional, for translation management) + +EOF +} + +################################################################################ +# MAIN +################################################################################ + +main() { + local command="${1:-all}" + + # Show banner + echo -e "${CYAN}╔════════════════════════════════════════════════╗${NC}" + echo -e "${CYAN}║ Swiss Football Matchdata - i18n Management ║${NC}" + echo -e "${CYAN}╚════════════════════════════════════════════════╝${NC}\n" + + # Check dependencies + log_info "Checking dependencies..." + if ! check_dependencies; then + log_error "Missing required dependencies. Please install and try again." + exit 1 + fi + log_success "All dependencies available\n" + + # Execute command + case "$command" in + extract) + extract_strings + ;; + translate) + translate_strings + show_summary + ;; + build) + build_mo_files + show_summary + ;; + clean) + cleanup_regional_variants + ;; + all) + extract_strings && \ + translate_strings && \ + build_mo_files && \ + cleanup_regional_variants && \ + show_summary + ;; + help|--help|-h) + show_help + ;; + *) + log_error "Unknown command: $command" + echo "" + show_help + exit 1 + ;; + esac + + local exit_code=$? + if [[ $exit_code -eq 0 ]]; then + log_success "\nTask completed successfully!" + else + log_error "\nTask failed with exit code $exit_code" + fi + + exit $exit_code +} + +# Run main function with all arguments +main "$@" diff --git a/includes/class-swi-foot-admin.php b/includes/class-swi-foot-admin.php index 570487d..095ab0d 100644 --- a/includes/class-swi-foot-admin.php +++ b/includes/class-swi-foot-admin.php @@ -31,6 +31,7 @@ class Swi_Foot_Admin register_setting('swi_foot_settings', 'swi_foot_verein_id'); register_setting('swi_foot_settings', 'swi_foot_season_id'); register_setting('swi_foot_settings', 'swi_foot_match_cache_duration'); + register_setting('swi_foot_settings', 'swi_foot_api_language'); add_settings_section( 'swi_foot_api_section', @@ -44,6 +45,7 @@ class Swi_Foot_Admin add_settings_field('swi_foot_api_password', __('API Password (Application Pass)', 'swi_foot_matchdata'), array($this, 'password_render'), 'swi_foot_settings', 'swi_foot_api_section'); add_settings_field('swi_foot_verein_id', __('Verein ID (Club ID)', 'swi_foot_matchdata'), array($this, 'verein_id_render'), 'swi_foot_settings', 'swi_foot_api_section'); add_settings_field('swi_foot_season_id', __('Season ID', 'swi_foot_matchdata'), array($this, 'season_id_render'), 'swi_foot_settings', 'swi_foot_api_section'); + add_settings_field('swi_foot_api_language', __('API Response Language', 'swi_foot_matchdata'), array($this, 'language_render'), 'swi_foot_settings', 'swi_foot_api_section'); add_settings_section( 'swi_foot_cache_section', @@ -107,6 +109,17 @@ class Swi_Foot_Admin echo '

' . __('How long to cache match data in seconds (10-300)', 'swi_foot_matchdata') . '

'; } + public function language_render() + { + $language = get_option('swi_foot_api_language', '1'); + echo ''; + echo '

' . __('Select the language for API responses (German, French, or Italian)', 'swi_foot_matchdata') . '

'; + } + public function admin_scripts($hook) { if ($hook === 'settings_page_swiss-football-matchdata') { @@ -248,23 +261,21 @@ class Swi_Foot_Admin

-
+ -
- -
-

-

- - -

-
+ +
+ +

@@ -325,7 +336,11 @@ class Swi_Foot_Admin if (is_wp_error($teams)) { echo '

' . - sprintf(__('Error loading teams: %s', 'swi_foot_matchdata'), $teams->get_error_message()) . + sprintf( + /* translators: %s is the error message from the API */ + __('Error loading teams: %s', 'swi_foot_matchdata'), + $teams->get_error_message() + ) . '

'; return; } @@ -357,7 +372,12 @@ class Swi_Foot_Admin $cache_count = is_array($keys) ? count($keys) : 0; $cache_duration = get_option('swi_foot_match_cache_duration', 30); - echo '

' . sprintf(__('Currently caching %d match records with %d second cache duration.', 'swi_foot_matchdata'), $cache_count, $cache_duration) . '

'; + echo '

' . sprintf( + /* translators: %1$d is the number of cached match records, %2$d is the cache duration in seconds */ + __('Currently caching %1$d match records with %2$d second cache duration.', 'swi_foot_matchdata'), + $cache_count, + $cache_duration + ) . '

'; if ($cache_count > 0) { $timestamps = array(); @@ -460,7 +480,5 @@ class Swi_Foot_Admin \ No newline at end of file diff --git a/includes/class-swi-foot-api.php b/includes/class-swi-foot-api.php index 3c93248..5a28aa7 100644 --- a/includes/class-swi-foot-api.php +++ b/includes/class-swi-foot-api.php @@ -9,6 +9,7 @@ class Swi_Foot_API private $verein_id; private $season_id; private $cache_duration; + private $language; public function __construct() { @@ -18,6 +19,7 @@ class Swi_Foot_API $this->verein_id = get_option('swi_foot_verein_id'); $this->season_id = get_option('swi_foot_season_id', date('Y')); $this->cache_duration = get_option('swi_foot_match_cache_duration', 30); + $this->language = get_option('swi_foot_api_language', '1'); // AJAX actions were migrated to REST endpoints (see includes/class-swi-foot-rest.php) @@ -176,6 +178,7 @@ class Swi_Foot_API $response = wp_remote_get($url, array( 'headers' => array( 'X-User-Token' => $token, + 'X-User-Language' => $this->language, 'Content-Type' => 'application/json' ), 'timeout' => 30 @@ -204,7 +207,13 @@ class Swi_Foot_API if ($response_code !== 200) { $body_debug = wp_remote_retrieve_body($response); error_log('Swiss Football API: Request to ' . $url . ' returned ' . $response_code . ' - body: ' . substr($body_debug, 0, 1000)); - return new WP_Error('api_error', 'API request failed with code ' . $response_code); + + // Handle 406 Not Acceptable - data not yet available + if ($response_code === 406) { + return new WP_Error('data_not_available', 'Data not yet available', array('status_code' => 406)); + } + + return new WP_Error('api_error', 'API request failed with code ' . $response_code, array('status_code' => $response_code)); } $body = wp_remote_retrieve_body($response); @@ -348,6 +357,11 @@ class Swi_Foot_API return $this->api_request('/api/match/' . $match_id . '/events'); } + public function get_match_referees($match_id) + { + return $this->api_request('/api/match/' . $match_id . '/referees'); + } + public function get_team_picture($team_id) { // Special handling for team picture endpoint which returns 200 with data or 204 No Content @@ -364,6 +378,7 @@ class Swi_Foot_API $response = wp_remote_get($url, array( 'headers' => array( 'X-User-Token' => $token, + 'X-User-Language' => $this->language, 'Content-Type' => 'application/json' ), 'timeout' => 30 @@ -410,9 +425,9 @@ class Swi_Foot_API return $body; } - public function get_commons_ids() + public function get_common_ids($params = array()) { - return $this->api_request('/api/commons/ids'); + return $this->api_request('/api/common/ids', $params); } /** @@ -441,17 +456,54 @@ class Swi_Foot_API */ public function test_connection() { - // Actually test the connection by making an API request - $result = $this->api_request('/api/teams', array('vereinId' => $this->verein_id)); - - // Check if the request was successful (not an error) - if (is_wp_error($result)) { - error_log('Swiss Football API: Connection test failed - ' . $result->get_error_message()); - return false; + // First, check if credentials are configured + if (empty($this->username) || empty($this->password)) { + return array( + 'success' => false, + 'error' => 'API credentials not configured', + 'details' => 'Please configure API Username and Password in Settings → Swiss Football' + ); + } + + // Check if Verein ID is configured + if (empty($this->verein_id)) { + return array( + 'success' => false, + 'error' => 'Verein ID (Club ID) not configured', + 'details' => 'Please configure Verein ID in Settings → Swiss Football' + ); } - // Verify we got a response (array means success) - return is_array($result); + // Test connection using the /api/common/ids endpoint with required parameters + $result = $this->get_common_ids(array( + 'ClubId' => $this->verein_id, + 'Language' => 1 // 1 = German + )); + + if (is_wp_error($result)) { + $error_msg = $result->get_error_message(); + error_log('Swiss Football API: Connection test failed - ' . $error_msg); + + return array( + 'success' => false, + 'error' => 'API connection failed', + 'details' => $error_msg + ); + } + + if (!is_array($result)) { + return array( + 'success' => false, + 'error' => 'Invalid API response', + 'details' => 'The API returned unexpected data format' + ); + } + + return array( + 'success' => true, + 'error' => null, + 'details' => 'Connection successful!' + ); } public function get_current_match($team_id) diff --git a/includes/class-swi-foot-blocks.php b/includes/class-swi-foot-blocks.php index 6771cc1..8759e85 100644 --- a/includes/class-swi-foot-blocks.php +++ b/includes/class-swi-foot-blocks.php @@ -17,6 +17,23 @@ class Swi_Foot_Blocks public function register_blocks() { + // Register custom block category for Swiss Football blocks + add_filter('block_categories_all', function($categories) { + // Check if category already exists + foreach ($categories as $cat) { + if ($cat['slug'] === 'swi-football') { + return $categories; // Already registered + } + } + // Add custom category with translated label + $categories[] = array( + 'slug' => 'swi-football', + 'title' => __('Swiss Football', 'swi_foot_matchdata'), + 'icon' => 'soccer' + ); + return $categories; + }); + // Register blocks from metadata (block.json) and provide server-side render callbacks $base = dirname(__DIR__) . '/blocks'; @@ -90,14 +107,6 @@ class Swi_Foot_Blocks ) ); } - // Register additional blocks (editor-only save shortcodes) - if ( file_exists( $base . '/team-data/block.json' ) ) { - register_block_type_from_metadata( $base . '/team-data', array( - 'editor_script' => 'swi-foot-editor-blocks', - 'editor_style' => 'swi-foot-editor-styles' - ) ); - } - if ( file_exists( $base . '/match-roster/block.json' ) ) { register_block_type_from_metadata( $base . '/match-roster', array( 'render_callback' => array( $this, 'render_match_roster_block' ), @@ -113,6 +122,22 @@ class Swi_Foot_Blocks 'editor_style' => 'swi-foot-editor-styles' ) ); } + + if ( file_exists( $base . '/match-bench/block.json' ) ) { + register_block_type_from_metadata( $base . '/match-bench', array( + 'render_callback' => array( $this, 'render_match_bench_block' ), + 'editor_script' => 'swi-foot-editor-blocks', + 'editor_style' => 'swi-foot-editor-styles' + ) ); + } + + if ( file_exists( $base . '/match-referees/block.json' ) ) { + register_block_type_from_metadata( $base . '/match-referees', array( + 'render_callback' => array( $this, 'render_match_referees_block' ), + 'editor_script' => 'swi-foot-editor-blocks', + 'editor_style' => 'swi-foot-editor-styles' + ) ); + } } public function enqueue_scripts() @@ -223,7 +248,11 @@ class Swi_Foot_Blocks if (is_wp_error($standings)) { return '
' . - sprintf(__('Error loading standings: %s', 'swi_foot_matchdata'), $standings->get_error_message()) . + sprintf( + /* translators: %s is the error message from the API */ + __('Error loading standings: %s', 'swi_foot_matchdata'), + $standings->get_error_message() + ) . '
'; } @@ -281,6 +310,7 @@ class Swi_Foot_Blocks // Team must come from context only $team_id = $ctx['team_id'] ?? null; $limit = isset($attributes['limit']) ? $attributes['limit'] : 5; + $match_filter = isset($attributes['matchFilter']) ? $attributes['matchFilter'] : 'all'; if (empty($team_id)) { return '
' . __('Schedule: No team provided in container context.', 'swi_foot_matchdata') . '
'; @@ -291,18 +321,47 @@ class Swi_Foot_Blocks if (is_wp_error($events)) { return '
' . - sprintf(__('Error loading schedule: %s', 'swi_foot_matchdata'), $events->get_error_message()) . + sprintf( + /* translators: %s is the error message from the API */ + __('Error loading schedule: %s', 'swi_foot_matchdata'), + $events->get_error_message() + ) . '
'; } - // Filter upcoming events and limit results + // Filter upcoming events by match type (home/away/all) and limit results $upcoming_events = array(); if (is_array($events)) { foreach ($events as $event) { + // Check if match is in the future if (strtotime($event['matchDate']) >= time()) { - $upcoming_events[] = $event; - if (count($upcoming_events) >= $limit) { - break; + // Apply match filter (home/away/all) + $match_should_be_included = true; + + if ($match_filter !== 'all') { + // Determine if this is a home or away match + // teamAId is home team, teamBId is away team + $is_home_match = isset($event['teamAId']) && $event['teamAId'] == $team_id; + $is_away_match = isset($event['teamBId']) && $event['teamBId'] == $team_id; + + // If team IDs aren't available, try to infer from team names + if (!isset($event['teamAId']) || !isset($event['teamBId'])) { + // This is a fallback - not ideal but works if IDs aren't present + $is_home_match = true; // Default to home + } + + if ($match_filter === 'home' && !$is_home_match) { + $match_should_be_included = false; + } elseif ($match_filter === 'away' && !$is_away_match) { + $match_should_be_included = false; + } + } + + if ($match_should_be_included) { + $upcoming_events[] = $event; + if (count($upcoming_events) >= $limit) { + break; + } } } } @@ -400,7 +459,8 @@ class Swi_Foot_Blocks // Match must come from context $match_id = $ctx['match_id'] ?? ''; $side = $attributes['side'] ?? 'home'; - $with_bench = $attributes['withBench'] ? 'true' : 'false'; + $show_starting_squad = isset($attributes['showStartingSquad']) ? $attributes['showStartingSquad'] : true; + $show_bench = isset($attributes['showBench']) ? $attributes['showBench'] : false; if (empty($match_id)) { return '
' . __('Match Roster: No match provided in container context.', 'swi_foot_matchdata') . '
'; @@ -408,8 +468,11 @@ class Swi_Foot_Blocks // Build shortcode using match from context and side attribute $shortcode = '[swi_foot_roster match_id="' . esc_attr($match_id) . '" side="' . esc_attr($side) . '"'; - if ($with_bench === 'true') { - $shortcode .= ' with_bench="true"'; + if ($show_starting_squad) { + $shortcode .= ' show_starting="true"'; + } + if ($show_bench) { + $shortcode .= ' show_bench="true"'; } $shortcode .= ']'; @@ -446,6 +509,61 @@ class Swi_Foot_Blocks return do_shortcode($shortcode); } + /** + * Render match bench block + * Gets match from container context, displays team staff/substitutes + */ + public function render_match_bench_block($attributes, $content = '', $block = null) + { + // Get context from parent block container + $provided = is_object($block) && !empty($block->context['swi-foot/context']) ? $block->context['swi-foot/context'] : null; + $ctx = array(); + if (is_array($provided)) $ctx = $provided; + $post_defaults = function_exists('swi_foot_resolve_context') ? swi_foot_resolve_context(get_the_ID()) : array(); + $ctx = array_merge($post_defaults, $ctx); + + // Match must come from context + $match_id = $ctx['match_id'] ?? ''; + $side = $attributes['side'] ?? 'home'; + + if (empty($match_id)) { + return '
' . __('Match Bench: No match provided in container context.', 'swi_foot_matchdata') . '
'; + } + + // Build shortcode using match from context and side attribute + $shortcode = '[swi_foot_bench match_id="' . esc_attr($match_id) . '" side="' . esc_attr($side) . '"]'; + + // Process and return the shortcode + return do_shortcode($shortcode); + } + + /** + * Render match referees block + * Gets match from container context, displays match officials/referees + */ + public function render_match_referees_block($attributes, $content = '', $block = null) + { + // Get context from parent block container + $provided = is_object($block) && !empty($block->context['swi-foot/context']) ? $block->context['swi-foot/context'] : null; + $ctx = array(); + if (is_array($provided)) $ctx = $provided; + $post_defaults = function_exists('swi_foot_resolve_context') ? swi_foot_resolve_context(get_the_ID()) : array(); + $ctx = array_merge($post_defaults, $ctx); + + // Match must come from context + $match_id = $ctx['match_id'] ?? ''; + + if (empty($match_id)) { + return '
' . __('Match Referees: No match provided in container context.', 'swi_foot_matchdata') . '
'; + } + + // Build shortcode using match from context + $shortcode = '[swi_foot_referees match_id="' . esc_attr($match_id) . '"]'; + + // Process and return the shortcode + return do_shortcode($shortcode); + } + private function render_team_selector($block_type) { $api = new Swi_Foot_API(); diff --git a/includes/class-swi-foot-rest.php b/includes/class-swi-foot-rest.php index 876c412..53051f9 100644 --- a/includes/class-swi-foot-rest.php +++ b/includes/class-swi-foot-rest.php @@ -84,18 +84,10 @@ class Swi_Foot_REST { ) )); - // Also allow team_id as a path parameter: /wp-json/swi-foot/v1/matches/123 - register_rest_route('swi-foot/v1', '/matches/(?P\d+)', array( + register_rest_route('swi-foot/v1', '/block-status/(?P\d+)/(?P[a-z_]+)', array( 'methods' => 'GET', - 'callback' => array($this, 'get_matches_for_team'), - 'permission_callback' => '__return_true', - 'args' => array( - 'team_id' => array( - 'validate_callback' => function($param, $request, $key) { - return is_numeric($param); - } - ) - ) + 'callback' => array($this, 'check_block_status'), + 'permission_callback' => '__return_true' )); // Single match details: /wp-json/swi-foot/v1/match/ @@ -129,9 +121,9 @@ class Swi_Foot_REST { ) )); - register_rest_route('swi-foot/v1', '/commons-ids', array( + register_rest_route('swi-foot/v1', '/common-ids', array( 'methods' => 'GET', - 'callback' => array($this, 'get_commons_ids'), + 'callback' => array($this, 'get_common_ids'), 'permission_callback' => '__return_true' )); @@ -210,7 +202,7 @@ class Swi_Foot_REST { return rest_ensure_response($normalized); } - public function get_commons_ids($request) { + public function get_common_ids($request) { $api = new Swi_Foot_API(); $commons = $api->get_commons_ids(); if (is_wp_error($commons)) { @@ -370,12 +362,77 @@ class Swi_Foot_REST { public function admin_test_connection($request) { $api = new Swi_Foot_API(); if (method_exists($api, 'test_connection')) { - $ok = $api->test_connection(); + $result = $api->test_connection(); } else { - $ok = false; + $result = array( + 'success' => false, + 'error' => 'test_connection method not found', + 'details' => 'Plugin may be incorrectly installed' + ); + } + + // Return response with full error details + if (is_array($result) && isset($result['success'])) { + if ($result['success']) { + return rest_ensure_response(array( + 'success' => true, + 'message' => isset($result['details']) ? $result['details'] : 'Connection successful!' + )); + } else { + return new WP_REST_Response(array( + 'success' => false, + 'error' => isset($result['error']) ? $result['error'] : 'Connection failed', + 'details' => isset($result['details']) ? $result['details'] : 'Unknown error' + ), 400); + } + } + + // Fallback for unexpected response format + return new WP_REST_Response(array( + 'success' => false, + 'error' => 'Unexpected response from API test', + 'details' => 'Unable to determine connection status' + ), 400); + } + + public function check_block_status($request) { + $match_id = $request->get_param('match_id'); + $endpoint = $request->get_param('endpoint'); + + if (empty($match_id) || empty($endpoint)) { + return rest_ensure_response(array('status' => 'error', 'message' => 'Missing parameters')); + } + + $api = new Swi_Foot_API(); + + // Map endpoint names to API methods + $method_map = array( + 'roster' => 'get_match_players', + 'bench' => 'get_match_bench', + 'referees' => 'get_match_referees', + 'events' => 'get_match_events' + ); + + if (!isset($method_map[$endpoint])) { + return rest_ensure_response(array('status' => 'error', 'message' => __('Unknown endpoint', 'swi_foot_matchdata'))); + } + + $method = $method_map[$endpoint]; + $result = $api->$method($match_id); + + // Determine status based on result + if (is_wp_error($result)) { + $code = $result->get_error_code(); + if ($code === 'data_not_available') { + return rest_ensure_response(array('status' => 'warning', 'message' => __('Data not yet available', 'swi_foot_matchdata'))); + } else { + return rest_ensure_response(array('status' => 'error', 'message' => __('No data available', 'swi_foot_matchdata'))); + } + } elseif (empty($result)) { + return rest_ensure_response(array('status' => 'error', 'message' => __('No data available', 'swi_foot_matchdata'))); + } else { + return rest_ensure_response(array('status' => 'success', 'message' => __('Data available', 'swi_foot_matchdata'))); } - if ($ok) return rest_ensure_response(array('success' => true)); - return new WP_REST_Response(array('error' => 'Connection failed'), 400); } public function admin_delete_finished_match($request) { diff --git a/includes/class-swi-foot-shortcodes.php b/includes/class-swi-foot-shortcodes.php index 220d3e0..5bdb137 100644 --- a/includes/class-swi-foot-shortcodes.php +++ b/includes/class-swi-foot-shortcodes.php @@ -22,6 +22,8 @@ class Swi_Foot_Shortcodes add_shortcode('swi_foot_match_round', array($this, 'match_round_shortcode')); add_shortcode('swi_foot_standings', array($this, 'standings_shortcode')); add_shortcode('swi_foot_roster', array($this, 'roster_shortcode')); + add_shortcode('swi_foot_bench', array($this, 'bench_shortcode')); + add_shortcode('swi_foot_referees', array($this, 'referees_shortcode')); add_shortcode('swi_foot_events', array($this, 'events_shortcode')); add_shortcode('swi_foot_match_data', array($this, 'match_data_shortcode')); add_shortcode('swi_foot_match_home_team_logo', array($this, 'match_home_team_logo_shortcode')); @@ -44,6 +46,26 @@ class Swi_Foot_Shortcodes return $vars; } + /** + * Render error message, distinguishing between "data not available" (406) and other errors + * @param WP_Error $error The error object + * @return string HTML-formatted error message + */ + private function render_error_message($error) + { + if (!is_wp_error($error)) { + return ''; + } + + // Check if this is a "data not yet available" error (HTTP 406) + if ($error->get_error_code() === 'data_not_available') { + return '
⏳ ' . __('Data not yet available', 'swi_foot_matchdata') . '
'; + } + + // For other errors, show grey "no data available" message + return '
ℹ️ ' . __('No data available', 'swi_foot_matchdata') . '
'; + } + /** * Handle internal requests for team logo images * URL format: /?swi_foot_team_logo=team_id&position=home|away|event @@ -198,7 +220,7 @@ class Swi_Foot_Shortcodes $match_data = $this->get_match_data($atts); if (!$match_data) { - return '' . __('Match data not available', 'swi_foot_matchdata') . ''; + return '
' . __('Match data not available', 'swi_foot_matchdata') . '
'; } ob_start(); @@ -388,6 +410,139 @@ class Swi_Foot_Shortcodes return ''; } + /** + * Render match bench (team staff) list + * Usage: [swi_foot_bench match_id="12345"] + * Lists staff members (name and role) for both home and away teams + */ + public function bench_shortcode($atts) + { + $atts = shortcode_atts(array( + 'match_id' => '', + 'side' => '' // 'home' or 'away', shows both if not specified + ), $atts); + + $match_id = $atts['match_id']; + if (empty($match_id)) { + return '
' . __('Match ID required', 'swi_foot_matchdata') . '
'; + } + + $bench = $this->api->get_match_bench($match_id); + + if (is_wp_error($bench)) { + return $this->render_error_message($bench); + } + + if (empty($bench)) { + return '
' . __('No bench data available', 'swi_foot_matchdata') . '
'; + } + + // Normalize side parameter + $side = strtolower(trim($atts['side'])); + $show_side_filter = !empty($side) && in_array($side, array('home', 'away'), true); + + ob_start(); + ?> +
+ + +
+ +

+ +
    + +
  • + + + () + +
  • + +
+
+ + +
+ +

+ +
    + +
  • + + + () + +
  • + +
+
+ +
+ '' + ), $atts); + + $match_id = $atts['match_id']; + if (empty($match_id)) { + return '
✗ ' . __('Match ID required', 'swi_foot_matchdata') . '
'; + } + + $referees = $this->api->get_match_referees($match_id); + + if (is_wp_error($referees)) { + return $this->render_error_message($referees); + } + + if (empty($referees)) { + return '
ℹ️ ' . __('No data available', 'swi_foot_matchdata') . '
'; + } + + ob_start(); + ?> +
+
    + +
  • + : + +
  • + +
+
+ "2026-03-27") + // API provides date in Swiss time, use as-is without any timezone conversion + $date_part = substr($match['matchDate'], 0, 10); + if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date_part)) { return null; } - // Use WordPress date format setting + // Convert date string to WordPress format $date_format = get_option('date_format'); - return wp_date($date_format, $timestamp); + return date_i18n($date_format, strtotime($date_part)); } /** @@ -535,15 +691,20 @@ class Swi_Foot_Shortcodes return null; } - // Parse the matchDate string - handle multiple formats - $timestamp = strtotime($match['matchDate']); - if ($timestamp === false) { + // Extract time part from ISO datetime string (e.g., "2026-03-27T19:30:00" -> "19:30:00") + // API provides time in Swiss time, use as-is without any timezone conversion + if (strpos($match['matchDate'], 'T') === false) { + return null; + } + + $time_part = substr($match['matchDate'], 11, 8); + if (!preg_match('/^\d{2}:\d{2}:\d{2}$/', $time_part)) { return null; } - // Use WordPress time format setting + // Format time string with WordPress time format setting $time_format = get_option('time_format'); - return wp_date($time_format, $timestamp); + return date_i18n($time_format, strtotime('2000-01-01 ' . $time_part)); } private function get_match_data($atts) @@ -616,13 +777,13 @@ class Swi_Foot_Shortcodes ), $atts); if (empty($atts['team_id'])) { - return '' . __('Team ID required', 'swi_foot_matchdata') . ''; + return '
' . __('Team ID required', 'swi_foot_matchdata') . '
'; } $standings = $this->api->get_standings($atts['team_id']); if (is_wp_error($standings) || empty($standings)) { - return '' . __('Standings data not available', 'swi_foot_matchdata') . ''; + return '
' . __('Standings data not available', 'swi_foot_matchdata') . '
'; } ob_start(); @@ -667,16 +828,18 @@ class Swi_Foot_Shortcodes public function roster_shortcode($atts) { $atts = shortcode_atts(array( - 'match_id' => '', - 'team_id' => '', - 'show_current' => 'false', - 'side' => '', - 'with_bench' => 'false' + 'match_id' => '', + 'team_id' => '', + 'show_current' => 'false', + 'side' => '', + 'show_starting' => 'true', + 'show_bench' => 'false', + 'with_bench' => 'false' // Legacy support ), $atts); $side = strtolower(trim($atts['side'])); if (!in_array($side, array('home', 'away'), true)) { - return '' . __('Parameter "side" must be "home" or "away"', 'swi_foot_matchdata') . ''; + return '
' . __('Parameter "side" must be "home" or "away"', 'swi_foot_matchdata') . '
'; } $match_id = $atts['match_id']; @@ -688,27 +851,27 @@ class Swi_Foot_Shortcodes } if (empty($match_id)) { - return '' . __('Match ID required', 'swi_foot_matchdata') . ''; + return '
' . __('Match ID required', 'swi_foot_matchdata') . '
'; + } + + // Parse show_starting and show_bench attributes (handle legacy with_bench) + $show_starting = strtolower($atts['show_starting']) === 'true'; + $show_bench = strtolower($atts['show_bench']) === 'true'; + + // Legacy support: if with_bench is true and show_starting is default, show both + if (strtolower($atts['with_bench']) === 'true' && !$show_bench) { + $show_bench = true; } // First check if we have saved final data $saved = $this->api->get_finished_match_data($match_id); if ($saved) { - $players = $saved['roster']['players'] ?? array(); - $bench_players = $saved['roster']['bench'] ?? array(); + $players = $saved['roster']['players'] ?? array(); } else { // Live fetch $players = $this->api->get_match_players($match_id); if (is_wp_error($players)) { - return '' . __('Roster data not available', 'swi_foot_matchdata') . ': ' . esc_html($players->get_error_message()) . ''; - } - $bench_players = array(); - - if (strtolower($atts['with_bench']) === 'true') { - $bench = $this->api->get_match_bench($match_id); - if (!is_wp_error($bench)) { - $bench_players = $bench; - } + return $this->render_error_message($players); } // Check match ended & possibly save events + roster together @@ -722,68 +885,100 @@ class Swi_Foot_Shortcodes if (is_array($players)) { $this->api->save_finished_match_data( $match_id, - array('players' => $players, 'bench' => $bench_players), + array('players' => $players), $events ); } } } - // Filter roster for side - $filtered_players = array_filter($players, function ($p) use ($side) { + // Filter players by team side + $team_players = array_filter($players, function ($p) use ($side) { return $side === 'home' ? !empty($p['isHomeTeam']) : empty($p['isHomeTeam']); }); - $filtered_bench = array_filter($bench_players, function ($p) use ($side) { - return $side === 'home' ? !empty($p['isHomeTeam']) : empty($p['isHomeTeam']); + + // Split players into starting (assignmentRoleId = 0 or 1 for captain) and bench (assignmentRoleId > 1) + $starting_players = array_filter($team_players, function ($p) { + return isset($p['assignmentRoleId']) && ((int)$p['assignmentRoleId'] === 0 || (int)$p['assignmentRoleId'] === 1); }); + $bench_players = array_filter($team_players, function ($p) { + return !isset($p['assignmentRoleId']) || ((int)$p['assignmentRoleId'] > 1); + }); + + // If neither option is checked, return empty div + if (!$show_starting && !$show_bench) { + return '
' . __('No roster display options selected', 'swi_foot_matchdata') . '
'; + } ob_start(); ?>

- -
    - -
  • - -
  • - -
- -

+ + +
+

+
    + +
  • + C '; + } + + echo esc_html($jersey . ' – ' . $displayName); + + if (!empty($positionName)) { + echo ' (' . esc_html($positionName) . ')'; + } + ?> +
  • + +
+
- -

-
    - -
  • - -
  • - -
+ +
+ + + +
+

+
    + +
  • + (' . esc_html($positionName) . ')'; + } + ?> +
  • + +
+
+ + + +

+ +

' . __('Match ID required', 'swi_foot_matchdata') . ''; + return '
' . __('Match ID required', 'swi_foot_matchdata') . '
'; } // Try saved first @@ -824,7 +1019,7 @@ class Swi_Foot_Shortcodes } else { $events = $this->api->get_match_events($match_id); if (is_wp_error($events)) { - return '' . __('Events data not available', 'swi_foot_matchdata') . ''; + return $this->render_error_message($events); } // Check if match ended and store both data sets diff --git a/languages/swi_foot_matchdata-de_CH.mo b/languages/swi_foot_matchdata-de_CH.mo deleted file mode 100644 index 7f8b2e9baeffaf9f75420fc8e56492087eec9a0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2674 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 z zk=?;9*(>xro7h)a6k^0OY0~2J(+tGhemBk$xbsou6VCB9Tcp{3VAyX5A=eV4$^|uw zN?W#B*~L;;ofz-WnK%u{ZJ&I{@C%%oMmC^!KARx0&D*h~SSzz`M=^sR>s$}ETx+qt z<0@p~iz2`A(1cm3tJl<5oovloG6o9$F=pJdEJmEYpL>;hJbV9`CWAgVZmIlGWWrod zxyvs*9PFfXFx}KcT9o-@8D`(uW`FZEi$2`E1#=exY)~6gPR#MH^AQZTMk_{i=^UG2 z2bvgvv`0Q_Vzy1v;x2N9r91xlqgJ!WV4(>d7NIOzw9J2-`-Q1(_KmceSU*p*s?=jQ zG+;zXpGeHzs+kXUgSHhXo%pW76&gNpZl4Nk8}UqRFVJQ@6St*!Q%#952B;~s#(fW( zkt#oTGPh}5r#1C4NBu6COpMRpY8Nn$QbOi7Es7eGlPrn5TFWfA;kogt6rtJ875TL? z`*1|JZmXJG&gZZvbEViBW}$4*oaH**Y1sKp=0*b>jK{-Kj5I&#u`itDgpnL=8!?)o z1tZ{;rxdLXV?Aeen;F@HXBD=!$GZp=L!N2aJ#Jj?Jiw$`ze~-0&HMIVGi+|GAA0c+jaf;JinQxK#Aog6v zYuh_bDQmv%AzHSfa@uyQ*9nF{;_|kdoRm@=Z*AIB2f@blTFDx7Bg)*HnZ1;-dT^ZiE?& zbyK8n+3hAe`~UJ%O!Lypri=CvWKVAP%0L@-pIv-)u`h1fN{nrO&e@FX+XYuzgF_DI z*XOa-A9Wcx8ctvq6fX{PA!trwR##9S`^>qCuE4hH9K)RxPq#3hnK{&1vFzNPrpX$M-8ZtmZ7b z*EfqlC!cUcM^z?@XjkC;phrJTt00#VfeCYMZjssBkkz#@r~UZRTrSNhT7QN+!Vb~S zVz;h5ROGa_-DEg(lx?v+6x(pO#q13=W^a>0rf1F1X$>4n1 qb6vi}1~(2;Ba literal 0 HcmV?d00001 diff --git a/languages/swi_foot_matchdata-de_DE.po b/languages/swi_foot_matchdata-de_DE.po new file mode 100644 index 0000000..670ac37 --- /dev/null +++ b/languages/swi_foot_matchdata-de_DE.po @@ -0,0 +1,1315 @@ +msgid "" +msgstr "" +"Project-Id-Version: Swiss Football Matchdata\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-03-18 14:50+0100\n" +"PO-Revision-Date: 2025-02-15 12:00+0000\n" +"Language: de_CH\n" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:18 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:249 +#: includes/class-swi-foot-admin.php:18 +#: includes/class-swi-foot-admin.php:262 +msgid "Swiss Football Matchdata Settings" +msgstr "Swiss Football Matchdata Einstellungen" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:19 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:31 +#: includes/class-swi-foot-admin.php:19 +#: includes/class-swi-foot-blocks.php:31 +msgid "Swiss Football" +msgstr "Swiss Football" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:37 +#: includes/class-swi-foot-admin.php:38 +#, fuzzy +msgid "API Configuration" +msgstr "API-Verbindung testen" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:42 +#: includes/class-swi-foot-admin.php:43 +msgid "API Base URL" +msgstr "API Basis-URL" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:43 +#: includes/class-swi-foot-admin.php:44 +msgid "API Username (Application Key)" +msgstr "API Benutzername (Application Key)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:44 +#: includes/class-swi-foot-admin.php:45 +msgid "API Password (Application Pass)" +msgstr "API Passwort (Application Pass)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:45 +#: includes/class-swi-foot-admin.php:46 +msgid "Verein ID (Club ID)" +msgstr "Vereins-ID (Club ID)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:46 +#: includes/class-swi-foot-admin.php:47 +msgid "Season ID" +msgstr "Saison-ID" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:50 +#: includes/class-swi-foot-admin.php:52 +msgid "Cache Settings" +msgstr "Cache-Einstellungen" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:55 +#: includes/class-swi-foot-admin.php:57 +msgid "Match Data Cache Duration (seconds)" +msgstr "Cache-Dauer für Spieldaten (Sekunden)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:60 +#: includes/class-swi-foot-admin.php:62 +msgid "Configure your Swiss Football API credentials here." +msgstr "Konfigurieren Sie hier Ihre Swiss Football API-Anmeldedaten." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:65 +#: includes/class-swi-foot-admin.php:67 +msgid "Configure caching settings for match data." +msgstr "Konfigurieren Sie hier die Cache-Einstellungen für Spieldaten." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:72 +#: includes/class-swi-foot-admin.php:74 +msgid "The base URL for the Swiss Football API" +msgstr "Die Basis-URL für die Swiss Football API" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:79 +#: includes/class-swi-foot-admin.php:81 +#, fuzzy +msgid "Your API application key" +msgstr "API Benutzername (Application Key)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:86 +#: includes/class-swi-foot-admin.php:88 +#, fuzzy +msgid "Your API application password" +msgstr "API Passwort (Application Pass)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:93 +#: includes/class-swi-foot-admin.php:95 +#, fuzzy +msgid "Enter your club's Verein ID (Club ID)" +msgstr "Vereins-ID (Club ID)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:100 +#: includes/class-swi-foot-admin.php:102 +msgid "Current season ID (usually the year)" +msgstr "Aktuelle Saisons-ID (normalerweise das Jahr)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:107 +#: includes/class-swi-foot-admin.php:109 +msgid "How long to cache match data in seconds (10-300)" +msgstr "Wie lange Spieldaten zwischenspeichern, in Sekunden (10-300)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:175 +#: includes/class-swi-foot-admin.php:188 +#, fuzzy +msgid "Swiss Football Shortcodes" +msgstr "Swiss Football" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:187 +#: includes/class-swi-foot-admin.php:200 +msgid "Available Shortcodes:" +msgstr "Verfügbare Shortcodes:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:190 +#: includes/class-swi-foot-admin.php:203 +msgid "Full Match Display:" +msgstr "Vollständige Spielanzeige:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:196 +#: includes/class-swi-foot-admin.php:209 +msgid "Individual Match Elements:" +msgstr "Individuelle Spiel-Elemente:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:209 +#: includes/class-swi-foot-admin.php:222 +msgid "Parameters:" +msgstr "Parameter:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:219 +#: includes/class-swi-foot-admin.php:232 +msgid "Click any shortcode above to copy it to clipboard" +msgstr "Klicken Sie auf einen Shortcode oben, um ihn in die Zwischenablage zu kopieren" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:227 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:237 +#: includes/class-swi-foot-admin.php:240 +#: includes/class-swi-foot-admin.php:250 +msgid "Shortcode copied to clipboard!" +msgstr "Shortcode in die Zwischenablage kopiert!" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:268 +#: includes/class-swi-foot-admin.php:281 +msgid "Team Management" +msgstr "Teamverwaltung" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:271 +#: includes/class-swi-foot-admin.php:284 +msgid "Refresh Teams List" +msgstr "Mannschaftsliste aktualisieren" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:282 +#: includes/class-swi-foot-admin.php:295 +msgid "Cache Management" +msgstr "Cache-Verwaltung" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:285 +#: includes/class-swi-foot-admin.php:298 +msgid "Clear Match Data Cache" +msgstr "Spieldaten-Cache leeren" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:293 +#: includes/class-swi-foot-admin.php:306 +#, fuzzy +msgid "Finished Matches Data" +msgstr "Alle beendeten Spiele löschen" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:298 +#: includes/class-swi-foot-admin.php:311 +msgid "Quick Shortcode Reference" +msgstr "Shortcode-Kurzreferenz" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:301 +#: includes/class-swi-foot-admin.php:314 +msgid "Common Examples:" +msgstr "Häufige Beispiele:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:302 +#: includes/class-swi-foot-admin.php:315 +msgid "Display full match info:" +msgstr "Vollständige Spielinformationen anzeigen:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:306 +#: includes/class-swi-foot-admin.php:319 +msgid "Show next match for a team:" +msgstr "Nächstes Spiel für ein Team anzeigen:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:310 +#: includes/class-swi-foot-admin.php:323 +msgid "Individual elements in text:" +msgstr "Individuelle Elemente im Text:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 +msgid "The match between" +msgstr "Das Spiel zwischen" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 +msgid "and" +msgstr "und" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 +msgid "is on" +msgstr "ist am" + +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:326 +#: includes/class-swi-foot-admin.php:341 +#, php-format +msgid "Error loading teams: %s" +msgstr "Fehler beim Laden der Teams: %s" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:333 +#: includes/class-swi-foot-admin.php:350 +msgid "No teams found. Please check your API configuration." +msgstr "Keine Teams gefunden. Bitte überprüfen Sie Ihre API-Konfiguration." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:338 +#: includes/class-swi-foot-admin.php:355 +msgid "Available Teams:" +msgstr "Verfügbare Teams:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:358 +#, php-format +msgid "Currently caching %d match records with %d second cache duration." +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:373 +#: includes/class-swi-foot-admin.php:395 +msgid "Cache Range:" +msgstr "Cache-Bereich:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:374 +#: includes/class-swi-foot-admin.php:396 +msgid "Oldest:" +msgstr "Ältester:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:375 +#: includes/class-swi-foot-admin.php:397 +msgid "Newest:" +msgstr "Neuester:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:384 +#: includes/class-swi-foot-admin.php:406 +msgid "No finished match data stored." +msgstr "Keine gespeicherten, beendeten Spiele vorhanden." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:391 +#: includes/class-swi-foot-admin.php:413 +#, fuzzy +msgid "Match ID" +msgstr "Spielkader" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:392 +#: includes/class-swi-foot-admin.php:414 +msgid "Saved At" +msgstr "Gespeichert am" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:393 +#: includes/class-swi-foot-admin.php:415 +msgid "Players" +msgstr "Spieler" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:394 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:920 +#: includes/class-swi-foot-admin.php:416 +#: includes/class-swi-foot-shortcodes.php:950 +msgid "Bench" +msgstr "Ersatzbank" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:395 +#: includes/class-swi-foot-admin.php:417 +#, fuzzy +msgid "Events" +msgstr "Spielereignisse" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:413 +#: includes/class-swi-foot-admin.php:435 +msgid "Delete" +msgstr "Löschen" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:419 +#: includes/class-swi-foot-admin.php:441 +msgid "Clear All Finished Matches" +msgstr "Alle beendeten Spiele löschen" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:426 +#: includes/class-swi-foot-admin.php:448 +#, fuzzy +msgid "Delete this finished match data?" +msgstr "Keine gespeicherten, beendeten Spiele vorhanden." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:443 +#: includes/class-swi-foot-admin.php:465 +#, fuzzy +msgid "Clear all finished match data?" +msgstr "Alle beendeten Spiele löschen" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:243 +#: includes/class-swi-foot-blocks.php:243 +msgid "Standings: No team provided in container context." +msgstr "Rangliste: Kein Team im Container-Kontext vorhanden." + +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:251 +#: includes/class-swi-foot-blocks.php:253 +#, php-format +msgid "Error loading standings: %s" +msgstr "Fehler beim Laden der Rangliste: %s" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:256 +#: includes/class-swi-foot-blocks.php:260 +msgid "No standings data available." +msgstr "Keine Ranglistendaten verfügbar." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:262 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:764 +#: includes/class-swi-foot-blocks.php:266 +#: includes/class-swi-foot-shortcodes.php:786 +msgid "Current Standings" +msgstr "Aktuelle Rangliste" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:266 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:768 +#: includes/class-swi-foot-blocks.php:270 +#: includes/class-swi-foot-shortcodes.php:790 +msgid "Pos" +msgstr "Pos" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:267 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:769 +#: includes/class-swi-foot-blocks.php:271 +#: includes/class-swi-foot-shortcodes.php:791 +#, fuzzy +msgid "Team" +msgstr "Heimmannschaft" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:268 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:770 +#: includes/class-swi-foot-blocks.php:272 +#: includes/class-swi-foot-shortcodes.php:792 +msgid "P" +msgstr "S" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:269 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:771 +#: includes/class-swi-foot-blocks.php:273 +#: includes/class-swi-foot-shortcodes.php:793 +msgid "W" +msgstr "G" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:270 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:772 +#: includes/class-swi-foot-blocks.php:274 +#: includes/class-swi-foot-shortcodes.php:794 +msgid "D" +msgstr "U" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:271 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:773 +#: includes/class-swi-foot-blocks.php:275 +#: includes/class-swi-foot-shortcodes.php:795 +msgid "L" +msgstr "V" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:272 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:774 +#: includes/class-swi-foot-blocks.php:276 +#: includes/class-swi-foot-shortcodes.php:796 +msgid "GF" +msgstr "TF" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:273 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:775 +#: includes/class-swi-foot-blocks.php:277 +#: includes/class-swi-foot-shortcodes.php:797 +msgid "GA" +msgstr "TA" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:274 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:776 +#: includes/class-swi-foot-blocks.php:278 +#: includes/class-swi-foot-shortcodes.php:798 +msgid "Pts" +msgstr "Pkt" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:311 +#: includes/class-swi-foot-blocks.php:316 +msgid "Schedule: No team provided in container context." +msgstr "Zeitplan: Kein Team im Container-Kontext vorhanden." + +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:319 +#: includes/class-swi-foot-blocks.php:326 +#, php-format +msgid "Error loading schedule: %s" +msgstr "Fehler beim Laden des Zeitplans: %s" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:339 +#: includes/class-swi-foot-blocks.php:373 +msgid "Upcoming Matches" +msgstr "Bevorstehende Spiele" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:341 +#: includes/class-swi-foot-blocks.php:375 +msgid "No upcoming matches scheduled." +msgstr "Keine anstehenden Spiele geplant." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:432 +#: includes/class-swi-foot-blocks.php:466 +msgid "Match Roster: No match provided in container context." +msgstr "Spielerkader: Kein Spiel im Container-Kontext vorhanden." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:468 +#: includes/class-swi-foot-blocks.php:502 +msgid "Match Events: No match provided in container context." +msgstr "Spielereignisse: Kein Spiel im Container-Kontext vorhanden." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:539 +#: includes/class-swi-foot-blocks.php:574 +msgid "Please configure your API settings and ensure teams are available." +msgstr "Bitte konfigurieren Sie Ihre API-Einstellungen und stellen Sie sicher, dass Teams verfügbar sind." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:546 +#: includes/class-swi-foot-blocks.php:581 +#, php-format +msgid "Please select a team to display %s:" +msgstr "Bitte wählen Sie ein Team aus, um %s anzuzeigen:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:548 +#: includes/class-swi-foot-blocks.php:583 +msgid "Select a team..." +msgstr "Wählen Sie ein Team aus..." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:223 +#: includes/class-swi-foot-shortcodes.php:223 +#, fuzzy +msgid "Match data not available" +msgstr "Keine Ranglistendaten verfügbar." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 +msgid "Ja" +msgstr "Ja" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 +msgid "Nein" +msgstr "Nein" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:752 +#: includes/class-swi-foot-shortcodes.php:774 +msgid "Team ID required" +msgstr "Team-ID erforderlich" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:758 +#: includes/class-swi-foot-shortcodes.php:780 +#, fuzzy +msgid "Standings data not available" +msgstr "Keine Ranglistendaten verfügbar." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:814 +#: includes/class-swi-foot-shortcodes.php:836 +msgid "Parameter \"side\" must be \"home\" or \"away\"" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:426 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:495 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:826 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:976 +#: includes/class-swi-foot-shortcodes.php:427 +#: includes/class-swi-foot-shortcodes.php:517 +#: includes/class-swi-foot-shortcodes.php:848 +#: includes/class-swi-foot-shortcodes.php:1006 +msgid "Match ID required" +msgstr "Spiel-ID erforderlich" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:846 +#, fuzzy +msgid "Roster data not available" +msgstr "Keine Ranglistendaten verfügbar." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:888 +#: includes/class-swi-foot-shortcodes.php:910 +#, fuzzy +msgid "Team Roster" +msgstr "Spielkader" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:945 +#: includes/class-swi-foot-shortcodes.php:975 +#, fuzzy +msgid "No roster data available." +msgstr "Keine Ranglistendaten verfügbar." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:986 +#, fuzzy +msgid "Events data not available" +msgstr "Keine Ranglistendaten verfügbar." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1046 +#: includes/class-swi-foot-shortcodes.php:1076 +#, fuzzy +msgid "Live match events" +msgstr "Spielereignisse" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1047 +#: includes/class-swi-foot-shortcodes.php:1077 +#: src/editor-blocks.js:237 +msgid "Match Events" +msgstr "Spielereignisse" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1053 +#: includes/class-swi-foot-shortcodes.php:1083 +#, fuzzy +msgid "Match minute" +msgstr "Spielereignisse" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1114 +#: includes/class-swi-foot-shortcodes.php:1144 +msgid "No events recorded yet." +msgstr "Bisher keine Ereignisse erfasst." + +#: src/editor-blocks.js:76 +#: src/editor-blocks.js:311 +msgid "Settings" +msgstr "Einstellungen" + +#: src/editor-blocks.js:77 +#: src/editor-blocks.js:109 +msgid "Team is inherited from the container context." +msgstr "Team wird vom Container-Kontext geerbt." + +#: src/editor-blocks.js:108 +msgid "Schedule settings" +msgstr "Zeitplaneinstellungen" + +#: src/editor-blocks.js:110 +msgid "Limit" +msgstr "Limit" + +#: assets/editor-blocks.js:30 +#: assets/editor-blocks.js:258 +#, fuzzy +msgid "Swiss Football Team Data" +msgstr "Swiss Football" + +#: assets/editor-blocks.js:154 +msgid "Team Selection" +msgstr "Teamauswahl" + +#: assets/editor-blocks.js:157 +msgid "1. Select Team" +msgstr "1. Team auswählen" + +#: assets/editor-blocks.js:159 +#: assets/editor-blocks.js:423 +#: assets/editor-blocks.js:576 +msgid "Choose a team..." +msgstr "Wählen Sie ein Team aus..." + +#: src/editor-blocks.js:81 +#, fuzzy +msgid "Standings" +msgstr "Aktuelle Rangliste" + +#: assets/editor-blocks.js:331 +#: src/editor-blocks.js:137 +msgid "Swiss Football Match Roster" +msgstr "Schweizer Fussball Spielerliste" + +#: src/editor-blocks.js:152 +#: src/editor-blocks.js:211 +#: src/editor-blocks.js:272 +msgid "Display Options" +msgstr "Anzeigeoptionen" + +#: src/editor-blocks.js:153 +#: src/editor-blocks.js:212 +msgid "Match and team are inherited from the container context." +msgstr "Spiel und Team werden vom Container-Kontext geerbt." + +#: src/editor-blocks.js:155 +#: src/editor-blocks.js:275 +#, fuzzy +msgid "Team Side" +msgstr "Heimmannschaft" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:453 +#: includes/class-swi-foot-shortcodes.php:468 +#: assets/editor-blocks.js:447 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 +#, fuzzy +msgid "Home Team" +msgstr "Heimmannschaft" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:466 +#: includes/class-swi-foot-shortcodes.php:485 +#: assets/editor-blocks.js:448 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 +msgid "Away Team" +msgstr "Gastmannschaft" + +#: assets/editor-blocks.js:455 +msgid "Include Bench Players" +msgstr "Ersatzspieler einbeziehen" + +#: assets/editor-blocks.js:508 +#: src/editor-blocks.js:197 +msgid "Swiss Football Match Events" +msgstr "Schweizer Fussball Match-Ereignisse" + +#: assets/editor-blocks.js:597 +#: src/editor-blocks.js:214 +msgid "Refresh Interval (seconds)" +msgstr "Aktualisierungsintervall (Sekunden)" + +#: src/editor-blocks.js:222 +msgid "Event Order" +msgstr "Ereignisreihenfolge" + +#: src/editor-blocks.js:226 +msgid "Dynamic (Newest first while live, chronological after)" +msgstr "Dynamisch (Neueste zuerst während Live-Spiel, chronologisch danach)" + +#: src/editor-blocks.js:227 +msgid "Newest First" +msgstr "Neueste zuerst" + +#: src/editor-blocks.js:228 +msgid "Oldest First" +msgstr "Älteste zuerst" + +#: src/editor-blocks.js:230 +msgid "Dynamic: newest events at top while match is ongoing, chronological (oldest first) after match ends" +msgstr "Dynamisch: Neueste Ereignisse oben während Spiel läuft, chronologisch (älteste zuerst) nach Spielende" + +#: src/format-shortcode.js:31 +msgid "— Select data point…" +msgstr "— Datenpunkt auswählen…" + +#: src/format-shortcode.js:32 +msgid "Match-Typ" +msgstr "Match-Typ" + +#: src/format-shortcode.js:33 +msgid "Liga" +msgstr "Liga" + +#: src/format-shortcode.js:34 +msgid "Gruppe" +msgstr "Gruppe" + +#: src/format-shortcode.js:35 +msgid "Runde" +msgstr "Runde" + +#: src/format-shortcode.js:36 +msgid "Spielfeld" +msgstr "Spielfeld" + +#: src/format-shortcode.js:37 +msgid "Heimteam" +msgstr "Heimteam" + +#: src/format-shortcode.js:38 +msgid "Gastteam" +msgstr "Gastteam" + +#: src/format-shortcode.js:39 +msgid "Tore Heim" +msgstr "Tore Heim" + +#: src/format-shortcode.js:40 +msgid "Tore Gast" +msgstr "Tore Gast" + +#: src/format-shortcode.js:41 +msgid "Tore Halbzeit Heim" +msgstr "Tore Halbzeit Heim" + +#: src/format-shortcode.js:42 +msgid "Tore Halbzeit Gast" +msgstr "Tore Halbzeit Gast" + +#: src/format-shortcode.js:43 +msgid "Spieltag" +msgstr "Spieltag" + +#: src/format-shortcode.js:44 +msgid "Spielzeit" +msgstr "Spielzeit" + +#: src/format-shortcode.js:45 +msgid "Spielstatus" +msgstr "Spielstatus" + +#: src/format-shortcode.js:46 +msgid "Spiel pausiert" +msgstr "Spiel pausiert" + +#: src/format-shortcode.js:47 +msgid "Spiel beendet" +msgstr "Spiel beendet" + +#: src/format-shortcode.js:52 +msgid "— Select shortcode…" +msgstr "— Shortcode auswählen…" + +#: src/format-shortcode.js:53 +msgid "Heimteam Logo" +msgstr "Heimteam-Logo" + +#: src/format-shortcode.js:54 +msgid "Gastteam Logo" +msgstr "Gastteam-Logo" + +#: src/format-shortcode.js:55 +msgid "Heimteam Logo (URL)" +msgstr "Heimteam-Logo (URL)" + +#: src/format-shortcode.js:56 +msgid "Gastteam Logo (URL)" +msgstr "Gastteam-Logo (URL)" + +#: src/format-shortcode.js:229 +#: src/format-shortcode.js:242 +#: src/format-shortcode.js:360 +#: src/format-shortcode.js:394 +#, fuzzy +msgid "Insert Match Data" +msgstr "Alle beendeten Spiele löschen" + +#: src/format-shortcode.js:234 +msgid "No match data available on this page. Please add match context first." +msgstr "Keine Spieldaten auf dieser Seite vorhanden. Bitte fügen Sie zuerst einen Spiel-Kontext hinzu." + +#: assets/editor-blocks.js:135 +#: src/format-shortcode.js:255 +#, fuzzy +msgid "Match Data" +msgstr "Spielkader" + +#: src/format-shortcode.js:265 +msgid "Shortcodes" +msgstr "" + +#: src/format-shortcode.js:278 +msgid "Data Point" +msgstr "Datenpunkt" + +#: src/format-shortcode.js:282 +msgid "Select which match data to display" +msgstr "Wählen Sie, welche Spieldaten angezeigt werden sollen" + +#: src/format-shortcode.js:291 +msgid "Preview:" +msgstr "Vorschau:" + +#: src/format-shortcode.js:299 +msgid "(no value)" +msgstr "(kein Wert)" + +#: src/format-shortcode.js:309 +msgid "Insert Data" +msgstr "Daten einfügen" + +#: src/format-shortcode.js:322 +msgid "Shortcode" +msgstr "Shortcode" + +#: src/format-shortcode.js:326 +msgid "Select a shortcode to insert (logos, etc.)" +msgstr "Wählen Sie einen einzufügenden Shortcode aus (Logos usw.)" + +#: src/format-shortcode.js:335 +msgid "Shortcode:" +msgstr "Shortcode:" + +#: src/format-shortcode.js:345 +msgid "Insert Shortcode" +msgstr "Shortcode einfügen" + +#. Plugin Name of the plugin +#: swiss-football-matchdata.php +msgid "Swiss Football Matchdata" +msgstr "Swiss Football Matchdata" + +#. Description of the plugin +#: swiss-football-matchdata.php +msgid "WordPress plugin to consume Swiss Football Association API for team standings, schedules, and match details with shortcode support" +msgstr "WordPress-Plugin zum Abrufen der Swiss Football Association API für Team-Rankings, Zeitpläne und Spiel-Details mit Shortcode-Unterstützung" + +#. Author of the plugin +#: swiss-football-matchdata.php +msgid "David Reindl (assisted by Claude AI)" +msgstr "David Reindl (unterstützt durch Claude AI)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:258 +#: includes/class-swi-foot-admin.php:271 +msgid "Save and Test" +msgstr "Speichern und testen" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:261 +#: includes/class-swi-foot-admin.php:274 +msgid "Save without Test" +msgstr "Speichern ohne Test" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:495 +#: includes/class-swi-foot-blocks.php:530 +msgid "Match Bench: No match provided in container context." +msgstr "Spielbench: Kein Spiel im Container-Kontext vorhanden." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:522 +#: includes/class-swi-foot-blocks.php:557 +msgid "Match Referees: No match provided in container context." +msgstr "Schiedsrichter: Kein Spiel im Container-Kontext vorhanden." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:62 +#: includes/class-swi-foot-rest.php:427 +#: includes/class-swi-foot-shortcodes.php:62 +msgid "Data not yet available" +msgstr "Daten noch nicht verfügbar" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:436 +#: includes/class-swi-foot-shortcodes.php:437 +msgid "No bench data available" +msgstr "Keine Bankdaten verfügbar" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:505 +msgid "No referees data available" +msgstr "Keine Schiedsrichter-Daten verfügbar" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:882 +#: includes/class-swi-foot-shortcodes.php:904 +msgid "No roster display options selected" +msgstr "Keine Kaderdisplay-Optionen ausgewählt" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:892 +#: includes/class-swi-foot-shortcodes.php:914 +msgid "Starting Squad" +msgstr "Startaufstellung" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:943 +#: includes/class-swi-foot-shortcodes.php:973 +msgid "No roster data to display." +msgstr "Keine Kaderdaten zum Anzeigen." + +#: includes/class-swi-foot-admin.php:48 +msgid "API Response Language" +msgstr "" + +#: includes/class-swi-foot-admin.php:116 +msgid "German" +msgstr "Deutsch" + +#: includes/class-swi-foot-admin.php:117 +msgid "French" +msgstr "Französisch" + +#: includes/class-swi-foot-admin.php:118 +msgid "Italian" +msgstr "Italienisch" + +#: includes/class-swi-foot-admin.php:120 +msgid "Select the language for API responses (German, French, or Italian)" +msgstr "Wählen Sie die Sprache für API-Antworten (Deutsch, Französisch oder Italienisch)" + +#. translators: %1$d is the number of cached match records, %2$d is the cache duration in seconds +#: includes/class-swi-foot-admin.php:377 +#, php-format +msgid "Currently caching %1$d match records with %2$d second cache duration." +msgstr "Speichert derzeit %1$d Spieldatensätze mit %2$d Sekunden Cache-Dauer." + +#: includes/class-swi-foot-rest.php:417 +msgid "Unknown endpoint" +msgstr "Unbekannter Endpunkt" + +#: includes/class-swi-foot-rest.php:429 +#: includes/class-swi-foot-rest.php:432 +#: includes/class-swi-foot-shortcodes.php:66 +#: includes/class-swi-foot-shortcodes.php:527 +msgid "No data available" +msgstr "Keine Daten verfügbar" + +#: includes/class-swi-foot-rest.php:434 +msgid "Data available" +msgstr "Daten verfügbar" + +#: includes/class-swi-foot-shortcodes.php:929 +msgid "Captain" +msgstr "Kapitän" + +#: assets/editor-blocks.js:31 +msgid "Display team standings or match data with guided selection" +msgstr "Zeigen Sie Team-Rankings oder Spieldaten mit geführter Auswahl an" + +#: assets/editor-blocks.js:35 +msgid "football" +msgstr "Fußball" + +#: assets/editor-blocks.js:36 +msgid "soccer" +msgstr "Fußball" + +#: assets/editor-blocks.js:37 +#: assets/editor-blocks.js:339 +msgid "team" +msgstr "Team" + +#: assets/editor-blocks.js:38 +msgid "swiss" +msgstr "Schweizer" + +#: assets/editor-blocks.js:133 +msgid "Choose what to display..." +msgstr "Wählen Sie, was angezeigt werden soll..." + +#: assets/editor-blocks.js:134 +msgid "Team Statistics (Standings/Ranking)" +msgstr "Team-Statistiken (Rangliste/Ranking)" + +#: assets/editor-blocks.js:140 +msgid "Complete Match Information" +msgstr "Vollständige Spielinformationen" + +#: assets/editor-blocks.js:141 +msgid "Home Team Name Only" +msgstr "Nur Name der Heimmannschaft" + +#: assets/editor-blocks.js:142 +msgid "Away Team Name Only" +msgstr "Nur Name der Auswärtsmannschaft" + +#: assets/editor-blocks.js:143 +msgid "Match Date Only" +msgstr "Nur Spieldatum" + +#: assets/editor-blocks.js:144 +msgid "Match Time Only" +msgstr "Nur Spielzeit" + +#: assets/editor-blocks.js:145 +msgid "Venue/Location Only" +msgstr "Nur Ort/Standort" + +#: assets/editor-blocks.js:146 +msgid "Score Only" +msgstr "Nur Ergebnis" + +#: assets/editor-blocks.js:147 +msgid "Match Status Only" +msgstr "Nur Spielstatus" + +#: assets/editor-blocks.js:148 +msgid "League Name Only" +msgstr "Nur Liga-Name" + +#: assets/editor-blocks.js:149 +msgid "Round Number Only" +msgstr "Nur Rundennummer" + +#: assets/editor-blocks.js:176 +msgid "2. What would you like to display?" +msgstr "2. Was möchten Sie anzeigen?" + +#: assets/editor-blocks.js:189 +msgid "Match Settings" +msgstr "" + +#: assets/editor-blocks.js:192 +msgid "3. Select Match" +msgstr "3. Spiel auswählen" + +#: assets/editor-blocks.js:194 +#: assets/editor-blocks.js:435 +#: assets/editor-blocks.js:587 +msgid "Choose a match..." +msgstr "Wählen Sie ein Spiel aus..." + +#: assets/editor-blocks.js:195 +msgid "Current Match (Next upcoming or recent)" +msgstr "Aktuelles Spiel (Nächstes bevorstehendes oder letztes)" + +#: assets/editor-blocks.js:206 +msgid "4. What match information to display?" +msgstr "4. Welche Spielinformationen sollen angezeigt werden?" + +#: assets/editor-blocks.js:214 +msgid "Advanced Options" +msgstr "Erweiterte Optionen" + +#: assets/editor-blocks.js:216 +msgid "Date/Time Format" +msgstr "Datums-/Uhrzeitformat" + +#: assets/editor-blocks.js:219 +#: assets/editor-blocks.js:225 +msgid "Default (WordPress setting)" +msgstr "Standard (WordPress-Einstellung)" + +#: assets/editor-blocks.js:234 +msgid "Score Separator" +msgstr "Ergebnis-Trennzeichen" + +#: assets/editor-blocks.js:261 +msgid "1. Please select a team to get started" +msgstr "1. Bitte wählen Sie ein Team aus" + +#: assets/editor-blocks.js:265 +msgid "2. Please choose what you want to display" +msgstr "2. Bitte wählen Sie aus, was Sie anzeigen möchten" + +#: assets/editor-blocks.js:269 +msgid "Will display team standings/ranking" +msgstr "Zeigt Team-Rankings/Ranglisten an" + +#: assets/editor-blocks.js:273 +msgid "3. Please select a match" +msgstr "3. Bitte wählen Sie ein Spiel aus" + +#: assets/editor-blocks.js:278 +msgid "Ready to display match data" +msgstr "Bereit zum Anzeigen von Spieldaten" + +#: assets/editor-blocks.js:281 +msgid "Generated shortcode:" +msgstr "Generierter Shortcode:" + +#: assets/editor-blocks.js:332 +msgid "Display match roster for home or away team, with optional bench players" +msgstr "Zeigen Sie den Spielerkader für die Heim- oder Auswärtsmannschaft an, mit optionalen Ersatzspielern" + +#: assets/editor-blocks.js:336 +msgid "roster" +msgstr "Kader" + +#: assets/editor-blocks.js:337 +msgid "players" +msgstr "Spieler" + +#: assets/editor-blocks.js:338 +msgid "lineup" +msgstr "Aufstellung" + +#: assets/editor-blocks.js:417 +#: assets/editor-blocks.js:572 +msgid "Match Selection" +msgstr "Spielauswahl" + +#: assets/editor-blocks.js:421 +#: assets/editor-blocks.js:574 +msgid "Select Team" +msgstr "Team auswählen" + +#: assets/editor-blocks.js:433 +#: assets/editor-blocks.js:585 +msgid "Select Match" +msgstr "Spiel auswählen" + +#: assets/editor-blocks.js:436 +#: assets/editor-blocks.js:588 +msgid "Current Match" +msgstr "Aktuelles Spiel" + +#: assets/editor-blocks.js:444 +msgid "Select Side" +msgstr "Seite auswählen" + +#: assets/editor-blocks.js:456 +msgid "When enabled, bench players will also be displayed" +msgstr "Wenn aktiviert, werden auch Ersatzspieler angezeigt" + +#: assets/editor-blocks.js:473 +#: src/editor-blocks.js:177 +msgid "Match Roster" +msgstr "Spielerkader" + +#: assets/editor-blocks.js:476 +msgid "Please select team, match, side, and bench option" +msgstr "Bitte wählen Sie Team, Spiel, Seite und Bank-Option aus" + +#: assets/editor-blocks.js:509 +msgid "Display live match events with auto-refresh" +msgstr "Zeigen Sie Live-Spielereignisse mit automatischer Aktualisierung an" + +#: assets/editor-blocks.js:513 +msgid "events" +msgstr "Ereignisse" + +#: assets/editor-blocks.js:514 +msgid "live" +msgstr "Live" + +#: assets/editor-blocks.js:515 +msgid "timeline" +msgstr "Zeitstrahl" + +#: assets/editor-blocks.js:516 +msgid "match" +msgstr "Spiel" + +#: assets/editor-blocks.js:595 +msgid "Auto-Refresh Settings" +msgstr "Automatische Aktualisierungseinstellungen" + +#: assets/editor-blocks.js:616 +msgid "Live Match Events" +msgstr "Live-Spielereignisse" + +#: assets/editor-blocks.js:618 +msgid "Please select team and match" +msgstr "Bitte wählen Sie Team und Spiel aus" + +#: assets/editor-blocks.js:620 +msgid "Will display live match events" +msgstr "Zeigt Live-Spielereignisse an" + +#: assets/editor-blocks.js:622 +msgid "Auto-refresh every" +msgstr "Automatische Aktualisierung alle" + +#: assets/editor-blocks.js:622 +msgid "seconds" +msgstr "Sekunden" + +#: src/editor-blocks.js:68 +msgid "Swiss Football Standings" +msgstr "Swiss Football Rangliste" + +#: src/editor-blocks.js:82 +msgid "League standings inherited from team context. ✓ Data will render on the front-end." +msgstr "Liga-Ranglisten geerbt von Team-Kontext. ✓ Daten werden auf der Frontend-Seite angezeigt." + +#: src/editor-blocks.js:94 +msgid "Swiss Football Schedule" +msgstr "Swiss Football Zeitplan" + +#: src/editor-blocks.js:124 +msgid "Schedule" +msgstr "" + +#: src/editor-blocks.js:125 +msgid "Team and match schedule inherited from context. ✓ Data will render on the front-end." +msgstr "Team- und Spielzeitplan vom Kontext geerbt. ✓ Daten werden auf der Frontend-Seite angezeigt." + +#: src/editor-blocks.js:163 +msgid "Show Starting Squad" +msgstr "" + +#: src/editor-blocks.js:169 +msgid "Show Bench" +msgstr "" + +#: src/editor-blocks.js:178 +msgid "Team and match are inherited from the container context. ✓ Data will render on the front-end." +msgstr "Team und Spiel werden vom Container-Kontext geerbt. ✓ Daten werden auf der Frontend-Seite angezeigt." + +#: src/editor-blocks.js:238 +msgid "Live match events inherited from context. ✓ Will update during match." +msgstr "Live-Spielereignisse vom Kontext geerbt. ✓ Werden während des Spiels aktualisiert." + +#: src/editor-blocks.js:258 +msgid "Swiss Football Match Bench" +msgstr "Swiss Football Spielbench" + +#: src/editor-blocks.js:273 +#: src/editor-blocks.js:312 +msgid "Match is inherited from the container context." +msgstr "Spiel wird vom Container-Kontext geerbt." + +#: src/editor-blocks.js:285 +msgid "Match Bench" +msgstr "Spielbench" + +#: src/editor-blocks.js:286 +msgid "Team bench and substitutes inherited from context. ✓ Data will render on the front-end." +msgstr "Team-Bank und Ersatzspieler vom Kontext geerbt. ✓ Daten werden auf der Frontend-Seite angezeigt." + +#: src/editor-blocks.js:302 +msgid "Swiss Football Match Referees" +msgstr "Swiss Football Schiedsrichter" + +#: src/editor-blocks.js:316 +msgid "Match Referees" +msgstr "Schiedsrichter" + +#: src/editor-blocks.js:317 +msgid "Match officials and referees inherited from context. ✓ Data will render on the front-end." +msgstr "Spielbeamte und Schiedsrichter vom Kontext geerbt. ✓ Daten werden auf der Frontend-Seite angezeigt." + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block title" +msgid "Swiss Football Context (container)" +msgstr "Swiss Football Kontext (Container)" + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block description" +msgid "Provides a team/season/match context to child blocks. Children will inherit these settings unless they override them." +msgstr "Bietet einen Team-/Saison-/Spielkontext für untergeordnete Blöcke. Untergeordnete Blöcke erben diese Einstellungen, es sei denn, sie werden außer Kraft gesetzt." + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block title" +msgid "Swiss Football Match Bench" +msgstr "" + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block description" +msgid "Display team staff and substitutes for a match" +msgstr "Zeigen Sie Team-Personal und Ersatzspieler für ein Spiel an" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block title" +msgid "Swiss Football Match Events" +msgstr "Swiss Football Spielereignisse" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block description" +msgid "Live match events with optional auto-refresh." +msgstr "Live-Spielereignisse mit optionaler automatischer Aktualisierung." + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block title" +msgid "Swiss Football Match Referees" +msgstr "" + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block description" +msgid "Display match officials and referees" +msgstr "Zeigen Sie Spielbeamte und Schiedsrichter an" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block title" +msgid "Swiss Football Match Roster" +msgstr "Swiss Football Spielerkader" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block description" +msgid "Display match roster for a selected match and side." +msgstr "Zeigen Sie den Spielerkader für ein ausgewähltes Spiel und eine ausgewählte Seite an." + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block title" +msgid "Swiss Football Schedule" +msgstr "" + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block description" +msgid "Display upcoming matches for a team." +msgstr "Zeigen Sie bevorstehende Spiele für ein Team an." + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block title" +msgid "SWI Football Shortcode Inserter" +msgstr "SWI Football Shortcode Inserter" + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block description" +msgid "Insert shortcode-based match or team displays." +msgstr "Fügen Sie Shortcode-basierte Spiel- oder Team-Anzeigen ein." + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block title" +msgid "Swiss Football Standings" +msgstr "" + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block description" +msgid "Display current standings for a team." +msgstr "Zeigen Sie aktuelle Ranglisten für ein Team an." + +#: src/editor-blocks.js:112 +msgid "Match Filter" +msgstr "Spielfilter" + +#: src/editor-blocks.js:115 +msgid "All Matches" +msgstr "Alle Spiele" + +#: src/editor-blocks.js:116 +msgid "Home Matches Only" +msgstr "Nur Heimspiele" + +#: src/editor-blocks.js:117 +msgid "Away Matches Only" +msgstr "Nur Auswärtsspiele" diff --git a/languages/swi_foot_matchdata-en_US.mo b/languages/swi_foot_matchdata-en_US.mo index f4c42875fb0b9dbf4d3d7128815379829f6e3c24..8cfa32f562970edeea1341e30f7c9c87f1fc7244 100644 GIT binary patch delta 658 zcmXZYODIH99LMqhT;>|%J>yZx%!GwzCP^MM8w+DMv6+-aZklG{RfZ%hvXG_kpL6Tn&-vfZJ?DRZU%{u~#!H~MAUqL9Go#HT(upyP7tb4( z<2#1%8(XlxNTd{d(2E1uh(lP9Q&@v5XyXp{;x10(HI|8NNVHg_f)9Nd#356UnL3B9 zd|yLt5;ciDY9sr`Bh(~LP#d~MP2$beUaqa{+fb9}LQNvYE3Q!tGikyJ<0@(r1=J+Y zP?NZE6V_lI6RBe8U35EL5pnmds3&}SX$6YhyV7>oXQv`*C%+WWEIRY~S!ZcsF&Xx! eo%!6dlgq|4S!XU8cDL+tH*NQyzSxhJ{`L!Ayhf-1 delta 676 zcmZ|LJxD@P7{>AARj)<%b^?q9KYv8$v2<$sijdC=dgKG$?6kkd_*n;u7K3 z5N*=n6jXaewAGLp(H2e7P+R}E&f0}@fA>B2aL#+4iuGX?sy^3|;t4T283PWbhA?XI z;`u@^eq#@sPNljrjI}t4Zk)vqOkx{uU^DKciA5a66HMVF)+tp`5tmZ+OiZJNNnK}j zy^X!hAD}dHuD!%|>Kl}XUQjL|-ALVqvObDFjH5KXgblcge$H3<-w&k@G02Y+N+b8! zgs-~(#0Tmct|J>iqa^ZlKrENdrc+y) YT-LsJui2;Om_1`ImMi9y@z0|04=b%nlK=n! diff --git a/languages/swi_foot_matchdata-en_US.po b/languages/swi_foot_matchdata-en_US.po index e01a5c8..b44ec40 100644 --- a/languages/swi_foot_matchdata-en_US.po +++ b/languages/swi_foot_matchdata-en_US.po @@ -2,557 +2,651 @@ msgid "" msgstr "" "Project-Id-Version: Swiss Football Matchdata\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-18 14:50+0100\n" -"PO-Revision-Date: 2025-02-15 12:00+0000\n" -"Language: en_US\n" +"Last-Translator: \n" +"Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-03-18 14:50+0100\n" +"PO-Revision-Date: 2025-02-15 12:00+0000\n" +"Language: en_US\n" -#: includes/class-swi-foot-admin.php:18 includes/class-swi-foot-admin.php:249 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:18 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:249 +#: includes/class-swi-foot-admin.php:18 +#: includes/class-swi-foot-admin.php:262 msgid "Swiss Football Matchdata Settings" msgstr "Swiss Football Matchdata Settings" +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:19 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:31 #: includes/class-swi-foot-admin.php:19 +#: includes/class-swi-foot-blocks.php:31 msgid "Swiss Football" msgstr "Swiss Football" -#: includes/class-swi-foot-admin.php:37 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:37 +#: includes/class-swi-foot-admin.php:38 #, fuzzy msgid "API Configuration" msgstr "Test API Connection" -#: includes/class-swi-foot-admin.php:42 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:42 +#: includes/class-swi-foot-admin.php:43 msgid "API Base URL" msgstr "API Base URL" -#: includes/class-swi-foot-admin.php:43 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:43 +#: includes/class-swi-foot-admin.php:44 msgid "API Username (Application Key)" msgstr "API Username (Application Key)" -#: includes/class-swi-foot-admin.php:44 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:44 +#: includes/class-swi-foot-admin.php:45 msgid "API Password (Application Pass)" msgstr "API Password (Application Pass)" -#: includes/class-swi-foot-admin.php:45 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:45 +#: includes/class-swi-foot-admin.php:46 msgid "Verein ID (Club ID)" msgstr "Verein ID (Club ID)" -#: includes/class-swi-foot-admin.php:46 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:46 +#: includes/class-swi-foot-admin.php:47 msgid "Season ID" msgstr "Season ID" -#: includes/class-swi-foot-admin.php:50 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:50 +#: includes/class-swi-foot-admin.php:52 msgid "Cache Settings" msgstr "" -#: includes/class-swi-foot-admin.php:55 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:55 +#: includes/class-swi-foot-admin.php:57 msgid "Match Data Cache Duration (seconds)" msgstr "Match Data Cache Duration (seconds)" -#: includes/class-swi-foot-admin.php:60 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:60 +#: includes/class-swi-foot-admin.php:62 msgid "Configure your Swiss Football API credentials here." msgstr "" -#: includes/class-swi-foot-admin.php:65 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:65 +#: includes/class-swi-foot-admin.php:67 msgid "Configure caching settings for match data." msgstr "" -#: includes/class-swi-foot-admin.php:72 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:72 +#: includes/class-swi-foot-admin.php:74 msgid "The base URL for the Swiss Football API" msgstr "" -#: includes/class-swi-foot-admin.php:79 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:79 +#: includes/class-swi-foot-admin.php:81 #, fuzzy msgid "Your API application key" msgstr "API Username (Application Key)" -#: includes/class-swi-foot-admin.php:86 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:86 +#: includes/class-swi-foot-admin.php:88 #, fuzzy msgid "Your API application password" msgstr "API Password (Application Pass)" -#: includes/class-swi-foot-admin.php:93 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:93 +#: includes/class-swi-foot-admin.php:95 #, fuzzy msgid "Enter your club's Verein ID (Club ID)" msgstr "Verein ID (Club ID)" -#: includes/class-swi-foot-admin.php:100 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:100 +#: includes/class-swi-foot-admin.php:102 msgid "Current season ID (usually the year)" msgstr "" -#: includes/class-swi-foot-admin.php:107 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:107 +#: includes/class-swi-foot-admin.php:109 msgid "How long to cache match data in seconds (10-300)" msgstr "" -#: includes/class-swi-foot-admin.php:175 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:175 +#: includes/class-swi-foot-admin.php:188 #, fuzzy msgid "Swiss Football Shortcodes" msgstr "Swiss Football" -#: includes/class-swi-foot-admin.php:187 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:187 +#: includes/class-swi-foot-admin.php:200 msgid "Available Shortcodes:" msgstr "" -#: includes/class-swi-foot-admin.php:190 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:190 +#: includes/class-swi-foot-admin.php:203 msgid "Full Match Display:" msgstr "" -#: includes/class-swi-foot-admin.php:196 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:196 +#: includes/class-swi-foot-admin.php:209 msgid "Individual Match Elements:" msgstr "" -#: includes/class-swi-foot-admin.php:209 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:209 +#: includes/class-swi-foot-admin.php:222 msgid "Parameters:" msgstr "" -#: includes/class-swi-foot-admin.php:219 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:219 +#: includes/class-swi-foot-admin.php:232 msgid "Click any shortcode above to copy it to clipboard" msgstr "" -#: includes/class-swi-foot-admin.php:227 includes/class-swi-foot-admin.php:237 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:227 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:237 +#: includes/class-swi-foot-admin.php:240 +#: includes/class-swi-foot-admin.php:250 msgid "Shortcode copied to clipboard!" msgstr "" -#: includes/class-swi-foot-admin.php:260 -msgid "Connection Test" -msgstr "" - -#: includes/class-swi-foot-admin.php:263 -msgid "Test API Connection" -msgstr "Test API Connection" - -#: includes/class-swi-foot-admin.php:270 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:268 +#: includes/class-swi-foot-admin.php:281 msgid "Team Management" msgstr "" -#: includes/class-swi-foot-admin.php:273 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:271 +#: includes/class-swi-foot-admin.php:284 msgid "Refresh Teams List" msgstr "Refresh Teams List" -#: includes/class-swi-foot-admin.php:284 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:282 +#: includes/class-swi-foot-admin.php:295 msgid "Cache Management" msgstr "" -#: includes/class-swi-foot-admin.php:287 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:285 +#: includes/class-swi-foot-admin.php:298 msgid "Clear Match Data Cache" msgstr "Clear Match Data Cache" -#: includes/class-swi-foot-admin.php:295 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:293 +#: includes/class-swi-foot-admin.php:306 #, fuzzy msgid "Finished Matches Data" msgstr "Clear All Finished Matches" -#: includes/class-swi-foot-admin.php:300 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:298 +#: includes/class-swi-foot-admin.php:311 msgid "Quick Shortcode Reference" msgstr "" -#: includes/class-swi-foot-admin.php:303 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:301 +#: includes/class-swi-foot-admin.php:314 msgid "Common Examples:" msgstr "" -#: includes/class-swi-foot-admin.php:304 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:302 +#: includes/class-swi-foot-admin.php:315 msgid "Display full match info:" msgstr "" -#: includes/class-swi-foot-admin.php:308 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:306 +#: includes/class-swi-foot-admin.php:319 msgid "Show next match for a team:" msgstr "" -#: includes/class-swi-foot-admin.php:312 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:310 +#: includes/class-swi-foot-admin.php:323 msgid "Individual elements in text:" msgstr "" -#: includes/class-swi-foot-admin.php:313 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 msgid "The match between" msgstr "" -#: includes/class-swi-foot-admin.php:313 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 msgid "and" msgstr "" -#: includes/class-swi-foot-admin.php:313 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 msgid "is on" msgstr "" -#: includes/class-swi-foot-admin.php:328 +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:326 +#: includes/class-swi-foot-admin.php:341 #, php-format msgid "Error loading teams: %s" msgstr "" -#: includes/class-swi-foot-admin.php:335 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:333 +#: includes/class-swi-foot-admin.php:350 msgid "No teams found. Please check your API configuration." msgstr "" -#: includes/class-swi-foot-admin.php:340 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:338 +#: includes/class-swi-foot-admin.php:355 msgid "Available Teams:" msgstr "" -#: includes/class-swi-foot-admin.php:360 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:358 #, php-format msgid "Currently caching %d match records with %d second cache duration." msgstr "" -#: includes/class-swi-foot-admin.php:375 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:373 +#: includes/class-swi-foot-admin.php:395 msgid "Cache Range:" msgstr "" -#: includes/class-swi-foot-admin.php:376 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:374 +#: includes/class-swi-foot-admin.php:396 msgid "Oldest:" msgstr "" -#: includes/class-swi-foot-admin.php:377 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:375 +#: includes/class-swi-foot-admin.php:397 msgid "Newest:" msgstr "" -#: includes/class-swi-foot-admin.php:386 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:384 +#: includes/class-swi-foot-admin.php:406 msgid "No finished match data stored." msgstr "No finished match data stored." -#: includes/class-swi-foot-admin.php:393 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:391 +#: includes/class-swi-foot-admin.php:413 #, fuzzy msgid "Match ID" msgstr "Match Roster" -#: includes/class-swi-foot-admin.php:394 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:392 +#: includes/class-swi-foot-admin.php:414 msgid "Saved At" msgstr "" -#: includes/class-swi-foot-admin.php:395 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:393 +#: includes/class-swi-foot-admin.php:415 msgid "Players" msgstr "" -#: includes/class-swi-foot-admin.php:396 -#: includes/class-swi-foot-shortcodes.php:768 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:394 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:920 +#: includes/class-swi-foot-admin.php:416 +#: includes/class-swi-foot-shortcodes.php:950 msgid "Bench" msgstr "Bench" -#: includes/class-swi-foot-admin.php:397 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:395 +#: includes/class-swi-foot-admin.php:417 #, fuzzy msgid "Events" msgstr "Match Events" -#: includes/class-swi-foot-admin.php:415 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:413 +#: includes/class-swi-foot-admin.php:435 msgid "Delete" msgstr "Delete" -#: includes/class-swi-foot-admin.php:421 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:419 +#: includes/class-swi-foot-admin.php:441 msgid "Clear All Finished Matches" msgstr "Clear All Finished Matches" -#: includes/class-swi-foot-admin.php:428 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:426 +#: includes/class-swi-foot-admin.php:448 #, fuzzy msgid "Delete this finished match data?" msgstr "No finished match data stored." -#: includes/class-swi-foot-admin.php:445 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:443 +#: includes/class-swi-foot-admin.php:465 #, fuzzy msgid "Clear all finished match data?" msgstr "Clear All Finished Matches" -#: includes/class-swi-foot-blocks.php:218 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:243 +#: includes/class-swi-foot-blocks.php:243 msgid "Standings: No team provided in container context." msgstr "" -#: includes/class-swi-foot-blocks.php:226 +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:251 +#: includes/class-swi-foot-blocks.php:253 #, php-format msgid "Error loading standings: %s" msgstr "" -#: includes/class-swi-foot-blocks.php:231 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:256 +#: includes/class-swi-foot-blocks.php:260 msgid "No standings data available." msgstr "No standings data available." -#: includes/class-swi-foot-blocks.php:237 -#: includes/class-swi-foot-shortcodes.php:631 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:262 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:764 +#: includes/class-swi-foot-blocks.php:266 +#: includes/class-swi-foot-shortcodes.php:786 msgid "Current Standings" msgstr "Current Standings" -#: includes/class-swi-foot-blocks.php:241 -#: includes/class-swi-foot-shortcodes.php:635 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:266 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:768 +#: includes/class-swi-foot-blocks.php:270 +#: includes/class-swi-foot-shortcodes.php:790 msgid "Pos" msgstr "" -#: includes/class-swi-foot-blocks.php:242 -#: includes/class-swi-foot-shortcodes.php:636 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:267 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:769 +#: includes/class-swi-foot-blocks.php:271 +#: includes/class-swi-foot-shortcodes.php:791 #, fuzzy msgid "Team" msgstr "Home Team" -#: includes/class-swi-foot-blocks.php:243 -#: includes/class-swi-foot-shortcodes.php:637 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:268 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:770 +#: includes/class-swi-foot-blocks.php:272 +#: includes/class-swi-foot-shortcodes.php:792 msgid "P" msgstr "" -#: includes/class-swi-foot-blocks.php:244 -#: includes/class-swi-foot-shortcodes.php:638 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:269 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:771 +#: includes/class-swi-foot-blocks.php:273 +#: includes/class-swi-foot-shortcodes.php:793 msgid "W" msgstr "" -#: includes/class-swi-foot-blocks.php:245 -#: includes/class-swi-foot-shortcodes.php:639 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:270 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:772 +#: includes/class-swi-foot-blocks.php:274 +#: includes/class-swi-foot-shortcodes.php:794 msgid "D" msgstr "" -#: includes/class-swi-foot-blocks.php:246 -#: includes/class-swi-foot-shortcodes.php:640 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:271 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:773 +#: includes/class-swi-foot-blocks.php:275 +#: includes/class-swi-foot-shortcodes.php:795 msgid "L" msgstr "" -#: includes/class-swi-foot-blocks.php:247 -#: includes/class-swi-foot-shortcodes.php:641 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:272 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:774 +#: includes/class-swi-foot-blocks.php:276 +#: includes/class-swi-foot-shortcodes.php:796 msgid "GF" msgstr "" -#: includes/class-swi-foot-blocks.php:248 -#: includes/class-swi-foot-shortcodes.php:642 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:273 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:775 +#: includes/class-swi-foot-blocks.php:277 +#: includes/class-swi-foot-shortcodes.php:797 msgid "GA" msgstr "" -#: includes/class-swi-foot-blocks.php:249 -#: includes/class-swi-foot-shortcodes.php:643 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:274 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:776 +#: includes/class-swi-foot-blocks.php:278 +#: includes/class-swi-foot-shortcodes.php:798 msgid "Pts" msgstr "" -#: includes/class-swi-foot-blocks.php:286 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:311 +#: includes/class-swi-foot-blocks.php:316 msgid "Schedule: No team provided in container context." msgstr "" -#: includes/class-swi-foot-blocks.php:294 +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:319 +#: includes/class-swi-foot-blocks.php:326 #, php-format msgid "Error loading schedule: %s" msgstr "" -#: includes/class-swi-foot-blocks.php:314 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:339 +#: includes/class-swi-foot-blocks.php:373 msgid "Upcoming Matches" msgstr "Upcoming Matches" -#: includes/class-swi-foot-blocks.php:316 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:341 +#: includes/class-swi-foot-blocks.php:375 msgid "No upcoming matches scheduled." msgstr "No upcoming matches scheduled." -#: includes/class-swi-foot-blocks.php:406 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:432 +#: includes/class-swi-foot-blocks.php:466 msgid "Match Roster: No match provided in container context." msgstr "" -#: includes/class-swi-foot-blocks.php:438 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:468 +#: includes/class-swi-foot-blocks.php:502 msgid "Match Events: No match provided in container context." msgstr "" -#: includes/class-swi-foot-blocks.php:455 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:539 +#: includes/class-swi-foot-blocks.php:574 msgid "Please configure your API settings and ensure teams are available." msgstr "" -#: includes/class-swi-foot-blocks.php:462 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:546 +#: includes/class-swi-foot-blocks.php:581 #, php-format msgid "Please select a team to display %s:" msgstr "" -#: includes/class-swi-foot-blocks.php:464 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:548 +#: includes/class-swi-foot-blocks.php:583 msgid "Select a team..." msgstr "" -#: includes/class-swi-foot-shortcodes.php:201 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:223 +#: includes/class-swi-foot-shortcodes.php:223 #, fuzzy msgid "Match data not available" msgstr "No standings data available." -#: includes/class-swi-foot-shortcodes.php:440 src/format-shortcode.js:201 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 msgid "Ja" msgstr "" -#: includes/class-swi-foot-shortcodes.php:440 src/format-shortcode.js:201 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 msgid "Nein" msgstr "" -#: includes/class-swi-foot-shortcodes.php:619 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:752 +#: includes/class-swi-foot-shortcodes.php:774 msgid "Team ID required" msgstr "" -#: includes/class-swi-foot-shortcodes.php:625 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:758 +#: includes/class-swi-foot-shortcodes.php:780 #, fuzzy msgid "Standings data not available" msgstr "No standings data available." -#: includes/class-swi-foot-shortcodes.php:679 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:814 +#: includes/class-swi-foot-shortcodes.php:836 msgid "Parameter \"side\" must be \"home\" or \"away\"" msgstr "" -#: includes/class-swi-foot-shortcodes.php:691 -#: includes/class-swi-foot-shortcodes.php:812 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:426 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:495 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:826 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:976 +#: includes/class-swi-foot-shortcodes.php:427 +#: includes/class-swi-foot-shortcodes.php:517 +#: includes/class-swi-foot-shortcodes.php:848 +#: includes/class-swi-foot-shortcodes.php:1006 msgid "Match ID required" msgstr "" -#: includes/class-swi-foot-shortcodes.php:703 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:846 #, fuzzy msgid "Roster data not available" msgstr "No standings data available." -#: includes/class-swi-foot-shortcodes.php:743 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:888 +#: includes/class-swi-foot-shortcodes.php:910 #, fuzzy msgid "Team Roster" msgstr "Match Roster" -#: includes/class-swi-foot-shortcodes.php:764 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:945 +#: includes/class-swi-foot-shortcodes.php:975 #, fuzzy msgid "No roster data available." msgstr "No standings data available." -#: includes/class-swi-foot-shortcodes.php:822 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:986 #, fuzzy msgid "Events data not available" msgstr "No standings data available." -#: includes/class-swi-foot-shortcodes.php:882 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1046 +#: includes/class-swi-foot-shortcodes.php:1076 #, fuzzy msgid "Live match events" msgstr "Match Events" -#: includes/class-swi-foot-shortcodes.php:883 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1047 +#: includes/class-swi-foot-shortcodes.php:1077 +#: src/editor-blocks.js:237 msgid "Match Events" msgstr "Match Events" -#: includes/class-swi-foot-shortcodes.php:889 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1053 +#: includes/class-swi-foot-shortcodes.php:1083 #, fuzzy msgid "Match minute" msgstr "Match Events" -#: includes/class-swi-foot-shortcodes.php:950 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1114 +#: includes/class-swi-foot-shortcodes.php:1144 msgid "No events recorded yet." msgstr "No events recorded yet." -#: src/editor-blocks.js:59 +#: src/editor-blocks.js:76 +#: src/editor-blocks.js:311 msgid "Settings" msgstr "" -#: src/editor-blocks.js:60 src/editor-blocks.js:80 +#: src/editor-blocks.js:77 +#: src/editor-blocks.js:109 msgid "Team is inherited from the container context." msgstr "" -#: src/editor-blocks.js:63 -msgid "Standings will render on the front-end." -msgstr "" - -#: src/editor-blocks.js:79 +#: src/editor-blocks.js:108 msgid "Schedule settings" msgstr "" -#: src/editor-blocks.js:81 +#: src/editor-blocks.js:110 msgid "Limit" msgstr "" -#: src/editor-blocks.js:84 -msgid "Upcoming matches will render on the front-end." -msgstr "" - -#: src/editor-blocks.js:99 +#: assets/editor-blocks.js:30 +#: assets/editor-blocks.js:258 #, fuzzy msgid "Swiss Football Team Data" msgstr "Swiss Football" -#: src/editor-blocks.js:126 +#: assets/editor-blocks.js:154 msgid "Team Selection" msgstr "" -#: src/editor-blocks.js:128 +#: assets/editor-blocks.js:157 msgid "1. Select Team" msgstr "" -#: src/editor-blocks.js:129 +#: assets/editor-blocks.js:159 +#: assets/editor-blocks.js:423 +#: assets/editor-blocks.js:576 msgid "Choose a team..." msgstr "" -#: src/editor-blocks.js:133 -msgid "2. What to display" -msgstr "" - -#: src/editor-blocks.js:133 -msgid "Choose..." -msgstr "" - -#: src/editor-blocks.js:133 +#: src/editor-blocks.js:81 #, fuzzy msgid "Standings" msgstr "Current Standings" -#: src/editor-blocks.js:133 -#, fuzzy -msgid "Match" -msgstr "Match Roster" - -#: src/editor-blocks.js:138 -msgid "Team data shortcode generator" -msgstr "" - -#: src/editor-blocks.js:161 +#: assets/editor-blocks.js:331 +#: src/editor-blocks.js:137 msgid "Swiss Football Match Roster" msgstr "Swiss Football Match Roster" -#: src/editor-blocks.js:168 src/editor-blocks.js:206 +#: src/editor-blocks.js:152 +#: src/editor-blocks.js:211 +#: src/editor-blocks.js:272 msgid "Display Options" msgstr "" -#: src/editor-blocks.js:169 src/editor-blocks.js:207 +#: src/editor-blocks.js:153 +#: src/editor-blocks.js:212 msgid "Match and team are inherited from the container context." msgstr "" -#: src/editor-blocks.js:171 +#: src/editor-blocks.js:155 +#: src/editor-blocks.js:275 #, fuzzy msgid "Team Side" msgstr "Home Team" -#: src/editor-blocks.js:173 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:453 +#: includes/class-swi-foot-shortcodes.php:468 +#: assets/editor-blocks.js:447 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 #, fuzzy msgid "Home Team" msgstr "Home Team" -#: src/editor-blocks.js:173 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:466 +#: includes/class-swi-foot-shortcodes.php:485 +#: assets/editor-blocks.js:448 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 msgid "Away Team" msgstr "Away Team" -#: src/editor-blocks.js:177 +#: assets/editor-blocks.js:455 msgid "Include Bench Players" msgstr "" -#: src/editor-blocks.js:183 -msgid "Match roster will render on the front-end." -msgstr "" - -#: src/editor-blocks.js:199 +#: assets/editor-blocks.js:508 +#: src/editor-blocks.js:197 msgid "Swiss Football Match Events" msgstr "Swiss Football Match Events" -#: src/editor-blocks.js:209 +#: assets/editor-blocks.js:597 +#: src/editor-blocks.js:214 msgid "Refresh Interval (seconds)" msgstr "" -#: src/editor-blocks.js:217 +#: src/editor-blocks.js:222 msgid "Event Order" msgstr "Event Order" -#: src/editor-blocks.js:221 +#: src/editor-blocks.js:226 msgid "Dynamic (Newest first while live, chronological after)" msgstr "Dynamic (Newest first while live, chronological after)" -#: src/editor-blocks.js:222 +#: src/editor-blocks.js:227 msgid "Newest First" msgstr "Newest First" -#: src/editor-blocks.js:223 +#: src/editor-blocks.js:228 msgid "Oldest First" msgstr "Oldest First" -#: src/editor-blocks.js:225 -msgid "" -"Dynamic: newest events at top while match is ongoing, chronological (oldest " -"first) after match ends" -msgstr "" -"Dynamic: newest events at top while match is ongoing, chronological (oldest " -"first) after match ends" - -#: src/editor-blocks.js:229 -msgid "Live events will be displayed on the front-end." -msgstr "" +#: src/editor-blocks.js:230 +msgid "Dynamic: newest events at top while match is ongoing, chronological (oldest first) after match ends" +msgstr "Dynamic: newest events at top while match is ongoing, chronological (oldest first) after match ends" #: src/format-shortcode.js:31 msgid "— Select data point…" @@ -642,8 +736,10 @@ msgstr "Home Team Logo (URL)" msgid "Gastteam Logo (URL)" msgstr "Away Team Logo (URL)" -#: src/format-shortcode.js:229 src/format-shortcode.js:242 -#: src/format-shortcode.js:356 src/format-shortcode.js:390 +#: src/format-shortcode.js:229 +#: src/format-shortcode.js:242 +#: src/format-shortcode.js:360 +#: src/format-shortcode.js:394 #, fuzzy msgid "Insert Match Data" msgstr "Clear All Finished Matches" @@ -652,6 +748,7 @@ msgstr "Clear All Finished Matches" msgid "No match data available on this page. Please add match context first." msgstr "" +#: assets/editor-blocks.js:135 #: src/format-shortcode.js:255 #, fuzzy msgid "Match Data" @@ -669,36 +766,550 @@ msgstr "" msgid "Select which match data to display" msgstr "" -#: src/format-shortcode.js:289 +#: src/format-shortcode.js:291 msgid "Preview:" msgstr "" -#: src/format-shortcode.js:297 +#: src/format-shortcode.js:299 msgid "(no value)" msgstr "" -#: src/format-shortcode.js:307 +#: src/format-shortcode.js:309 msgid "Insert Data" msgstr "" -#: src/format-shortcode.js:320 +#: src/format-shortcode.js:322 msgid "Shortcode" msgstr "" -#: src/format-shortcode.js:324 +#: src/format-shortcode.js:326 msgid "Select a shortcode to insert (logos, etc.)" msgstr "" -#: src/format-shortcode.js:331 +#: src/format-shortcode.js:335 msgid "Shortcode:" msgstr "" -#: src/format-shortcode.js:341 +#: src/format-shortcode.js:345 msgid "Insert Shortcode" msgstr "" -#~ msgid "Display match roster for a selected match and side." -#~ msgstr "Display match roster for a selected match and side." +#. Plugin Name of the plugin +#: swiss-football-matchdata.php +msgid "Swiss Football Matchdata" +msgstr "" -#~ msgid "Live match events with optional auto-refresh." -#~ msgstr "Live match events with optional auto-refresh." +#. Description of the plugin +#: swiss-football-matchdata.php +msgid "WordPress plugin to consume Swiss Football Association API for team standings, schedules, and match details with shortcode support" +msgstr "" + +#. Author of the plugin +#: swiss-football-matchdata.php +msgid "David Reindl (assisted by Claude AI)" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:258 +#: includes/class-swi-foot-admin.php:271 +msgid "Save and Test" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:261 +#: includes/class-swi-foot-admin.php:274 +msgid "Save without Test" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:495 +#: includes/class-swi-foot-blocks.php:530 +msgid "Match Bench: No match provided in container context." +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:522 +#: includes/class-swi-foot-blocks.php:557 +msgid "Match Referees: No match provided in container context." +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:62 +#: includes/class-swi-foot-rest.php:427 +#: includes/class-swi-foot-shortcodes.php:62 +msgid "Data not yet available" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:436 +#: includes/class-swi-foot-shortcodes.php:437 +msgid "No bench data available" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:505 +msgid "No referees data available" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:882 +#: includes/class-swi-foot-shortcodes.php:904 +msgid "No roster display options selected" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:892 +#: includes/class-swi-foot-shortcodes.php:914 +msgid "Starting Squad" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:943 +#: includes/class-swi-foot-shortcodes.php:973 +msgid "No roster data to display." +msgstr "" + +#: includes/class-swi-foot-admin.php:48 +msgid "API Response Language" +msgstr "" + +#: includes/class-swi-foot-admin.php:116 +msgid "German" +msgstr "" + +#: includes/class-swi-foot-admin.php:117 +msgid "French" +msgstr "" + +#: includes/class-swi-foot-admin.php:118 +msgid "Italian" +msgstr "" + +#: includes/class-swi-foot-admin.php:120 +msgid "Select the language for API responses (German, French, or Italian)" +msgstr "" + +#. translators: %1$d is the number of cached match records, %2$d is the cache duration in seconds +#: includes/class-swi-foot-admin.php:377 +#, php-format +msgid "Currently caching %1$d match records with %2$d second cache duration." +msgstr "" + +#: includes/class-swi-foot-rest.php:417 +msgid "Unknown endpoint" +msgstr "" + +#: includes/class-swi-foot-rest.php:429 +#: includes/class-swi-foot-rest.php:432 +#: includes/class-swi-foot-shortcodes.php:66 +#: includes/class-swi-foot-shortcodes.php:527 +msgid "No data available" +msgstr "" + +#: includes/class-swi-foot-rest.php:434 +msgid "Data available" +msgstr "" + +#: includes/class-swi-foot-shortcodes.php:929 +msgid "Captain" +msgstr "" + +#: assets/editor-blocks.js:31 +msgid "Display team standings or match data with guided selection" +msgstr "" + +#: assets/editor-blocks.js:35 +msgid "football" +msgstr "" + +#: assets/editor-blocks.js:36 +msgid "soccer" +msgstr "" + +#: assets/editor-blocks.js:37 +#: assets/editor-blocks.js:339 +msgid "team" +msgstr "" + +#: assets/editor-blocks.js:38 +msgid "swiss" +msgstr "" + +#: assets/editor-blocks.js:133 +msgid "Choose what to display..." +msgstr "" + +#: assets/editor-blocks.js:134 +msgid "Team Statistics (Standings/Ranking)" +msgstr "" + +#: assets/editor-blocks.js:140 +msgid "Complete Match Information" +msgstr "" + +#: assets/editor-blocks.js:141 +msgid "Home Team Name Only" +msgstr "" + +#: assets/editor-blocks.js:142 +msgid "Away Team Name Only" +msgstr "" + +#: assets/editor-blocks.js:143 +msgid "Match Date Only" +msgstr "" + +#: assets/editor-blocks.js:144 +msgid "Match Time Only" +msgstr "" + +#: assets/editor-blocks.js:145 +msgid "Venue/Location Only" +msgstr "" + +#: assets/editor-blocks.js:146 +msgid "Score Only" +msgstr "" + +#: assets/editor-blocks.js:147 +msgid "Match Status Only" +msgstr "" + +#: assets/editor-blocks.js:148 +msgid "League Name Only" +msgstr "" + +#: assets/editor-blocks.js:149 +msgid "Round Number Only" +msgstr "" + +#: assets/editor-blocks.js:176 +msgid "2. What would you like to display?" +msgstr "" + +#: assets/editor-blocks.js:189 +msgid "Match Settings" +msgstr "" + +#: assets/editor-blocks.js:192 +msgid "3. Select Match" +msgstr "" + +#: assets/editor-blocks.js:194 +#: assets/editor-blocks.js:435 +#: assets/editor-blocks.js:587 +msgid "Choose a match..." +msgstr "" + +#: assets/editor-blocks.js:195 +msgid "Current Match (Next upcoming or recent)" +msgstr "" + +#: assets/editor-blocks.js:206 +msgid "4. What match information to display?" +msgstr "" + +#: assets/editor-blocks.js:214 +msgid "Advanced Options" +msgstr "" + +#: assets/editor-blocks.js:216 +msgid "Date/Time Format" +msgstr "" + +#: assets/editor-blocks.js:219 +#: assets/editor-blocks.js:225 +msgid "Default (WordPress setting)" +msgstr "" + +#: assets/editor-blocks.js:234 +msgid "Score Separator" +msgstr "" + +#: assets/editor-blocks.js:261 +msgid "1. Please select a team to get started" +msgstr "" + +#: assets/editor-blocks.js:265 +msgid "2. Please choose what you want to display" +msgstr "" + +#: assets/editor-blocks.js:269 +msgid "Will display team standings/ranking" +msgstr "" + +#: assets/editor-blocks.js:273 +msgid "3. Please select a match" +msgstr "" + +#: assets/editor-blocks.js:278 +msgid "Ready to display match data" +msgstr "" + +#: assets/editor-blocks.js:281 +msgid "Generated shortcode:" +msgstr "" + +#: assets/editor-blocks.js:332 +msgid "Display match roster for home or away team, with optional bench players" +msgstr "" + +#: assets/editor-blocks.js:336 +msgid "roster" +msgstr "" + +#: assets/editor-blocks.js:337 +msgid "players" +msgstr "" + +#: assets/editor-blocks.js:338 +msgid "lineup" +msgstr "" + +#: assets/editor-blocks.js:417 +#: assets/editor-blocks.js:572 +msgid "Match Selection" +msgstr "" + +#: assets/editor-blocks.js:421 +#: assets/editor-blocks.js:574 +msgid "Select Team" +msgstr "" + +#: assets/editor-blocks.js:433 +#: assets/editor-blocks.js:585 +msgid "Select Match" +msgstr "" + +#: assets/editor-blocks.js:436 +#: assets/editor-blocks.js:588 +msgid "Current Match" +msgstr "" + +#: assets/editor-blocks.js:444 +msgid "Select Side" +msgstr "" + +#: assets/editor-blocks.js:456 +msgid "When enabled, bench players will also be displayed" +msgstr "" + +#: assets/editor-blocks.js:473 +#: src/editor-blocks.js:177 +msgid "Match Roster" +msgstr "" + +#: assets/editor-blocks.js:476 +msgid "Please select team, match, side, and bench option" +msgstr "" + +#: assets/editor-blocks.js:509 +msgid "Display live match events with auto-refresh" +msgstr "" + +#: assets/editor-blocks.js:513 +msgid "events" +msgstr "" + +#: assets/editor-blocks.js:514 +msgid "live" +msgstr "" + +#: assets/editor-blocks.js:515 +msgid "timeline" +msgstr "" + +#: assets/editor-blocks.js:516 +msgid "match" +msgstr "" + +#: assets/editor-blocks.js:595 +msgid "Auto-Refresh Settings" +msgstr "" + +#: assets/editor-blocks.js:616 +msgid "Live Match Events" +msgstr "" + +#: assets/editor-blocks.js:618 +msgid "Please select team and match" +msgstr "" + +#: assets/editor-blocks.js:620 +msgid "Will display live match events" +msgstr "" + +#: assets/editor-blocks.js:622 +msgid "Auto-refresh every" +msgstr "" + +#: assets/editor-blocks.js:622 +msgid "seconds" +msgstr "" + +#: src/editor-blocks.js:68 +msgid "Swiss Football Standings" +msgstr "" + +#: src/editor-blocks.js:82 +msgid "League standings inherited from team context. ✓ Data will render on the front-end." +msgstr "" + +#: src/editor-blocks.js:94 +msgid "Swiss Football Schedule" +msgstr "" + +#: src/editor-blocks.js:124 +msgid "Schedule" +msgstr "" + +#: src/editor-blocks.js:125 +msgid "Team and match schedule inherited from context. ✓ Data will render on the front-end." +msgstr "" + +#: src/editor-blocks.js:163 +msgid "Show Starting Squad" +msgstr "" + +#: src/editor-blocks.js:169 +msgid "Show Bench" +msgstr "" + +#: src/editor-blocks.js:178 +msgid "Team and match are inherited from the container context. ✓ Data will render on the front-end." +msgstr "" + +#: src/editor-blocks.js:238 +msgid "Live match events inherited from context. ✓ Will update during match." +msgstr "" + +#: src/editor-blocks.js:258 +msgid "Swiss Football Match Bench" +msgstr "" + +#: src/editor-blocks.js:273 +#: src/editor-blocks.js:312 +msgid "Match is inherited from the container context." +msgstr "" + +#: src/editor-blocks.js:285 +msgid "Match Bench" +msgstr "" + +#: src/editor-blocks.js:286 +msgid "Team bench and substitutes inherited from context. ✓ Data will render on the front-end." +msgstr "" + +#: src/editor-blocks.js:302 +msgid "Swiss Football Match Referees" +msgstr "" + +#: src/editor-blocks.js:316 +msgid "Match Referees" +msgstr "" + +#: src/editor-blocks.js:317 +msgid "Match officials and referees inherited from context. ✓ Data will render on the front-end." +msgstr "" + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block title" +msgid "Swiss Football Context (container)" +msgstr "" + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block description" +msgid "Provides a team/season/match context to child blocks. Children will inherit these settings unless they override them." +msgstr "" + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block title" +msgid "Swiss Football Match Bench" +msgstr "" + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block description" +msgid "Display team staff and substitutes for a match" +msgstr "" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block title" +msgid "Swiss Football Match Events" +msgstr "" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block description" +msgid "Live match events with optional auto-refresh." +msgstr "" + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block title" +msgid "Swiss Football Match Referees" +msgstr "" + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block description" +msgid "Display match officials and referees" +msgstr "" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block title" +msgid "Swiss Football Match Roster" +msgstr "" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block description" +msgid "Display match roster for a selected match and side." +msgstr "" + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block title" +msgid "Swiss Football Schedule" +msgstr "" + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block description" +msgid "Display upcoming matches for a team." +msgstr "" + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block title" +msgid "SWI Football Shortcode Inserter" +msgstr "" + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block description" +msgid "Insert shortcode-based match or team displays." +msgstr "" + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block title" +msgid "Swiss Football Standings" +msgstr "" + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block description" +msgid "Display current standings for a team." +msgstr "" + +#: src/editor-blocks.js:112 +msgid "Match Filter" +msgstr "" + +#: src/editor-blocks.js:115 +msgid "All Matches" +msgstr "" + +#: src/editor-blocks.js:116 +msgid "Home Matches Only" +msgstr "" + +#: src/editor-blocks.js:117 +msgid "Away Matches Only" +msgstr "" diff --git a/languages/swi_foot_matchdata-fr_FR.mo b/languages/swi_foot_matchdata-fr_FR.mo index 2a649c6ab149ed5904e36b23364ede65dbbafe6b..789aff6a4e1eece645ef8bad05408dfe8666dcf9 100644 GIT binary patch literal 19121 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 a)|M13lWqzgq@ZY-!e!;?Apa&4A@Lux6~in5 diff --git a/languages/swi_foot_matchdata-fr_FR.po b/languages/swi_foot_matchdata-fr_FR.po index 84148e7..839e9a0 100644 --- a/languages/swi_foot_matchdata-fr_FR.po +++ b/languages/swi_foot_matchdata-fr_FR.po @@ -2,629 +2,723 @@ msgid "" msgstr "" "Project-Id-Version: Swiss Football Matchdata\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-18 14:50+0100\n" -"PO-Revision-Date: 2025-02-15 12:00+0000\n" -"Language: fr_FR\n" +"Last-Translator: \n" +"Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-03-18 14:50+0100\n" +"PO-Revision-Date: 2025-02-15 12:00+0000\n" +"Language: fr_FR\n" -#: includes/class-swi-foot-admin.php:18 includes/class-swi-foot-admin.php:249 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:18 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:249 +#: includes/class-swi-foot-admin.php:18 +#: includes/class-swi-foot-admin.php:262 msgid "Swiss Football Matchdata Settings" msgstr "Paramètres Swiss Football Matchdata" +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:19 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:31 #: includes/class-swi-foot-admin.php:19 +#: includes/class-swi-foot-blocks.php:31 msgid "Swiss Football" msgstr "Swiss Football" -#: includes/class-swi-foot-admin.php:37 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:37 +#: includes/class-swi-foot-admin.php:38 #, fuzzy msgid "API Configuration" msgstr "Tester la connexion API" -#: includes/class-swi-foot-admin.php:42 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:42 +#: includes/class-swi-foot-admin.php:43 msgid "API Base URL" msgstr "URL de base API" -#: includes/class-swi-foot-admin.php:43 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:43 +#: includes/class-swi-foot-admin.php:44 msgid "API Username (Application Key)" msgstr "Nom d'utilisateur API (Clé d'application)" -#: includes/class-swi-foot-admin.php:44 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:44 +#: includes/class-swi-foot-admin.php:45 msgid "API Password (Application Pass)" msgstr "Mot de passe API (Application Pass)" -#: includes/class-swi-foot-admin.php:45 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:45 +#: includes/class-swi-foot-admin.php:46 msgid "Verein ID (Club ID)" msgstr "ID du club (Club ID)" -#: includes/class-swi-foot-admin.php:46 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:46 +#: includes/class-swi-foot-admin.php:47 msgid "Season ID" msgstr "ID de la saison" -#: includes/class-swi-foot-admin.php:50 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:50 +#: includes/class-swi-foot-admin.php:52 msgid "Cache Settings" -msgstr "" +msgstr "Paramètres de cache" -#: includes/class-swi-foot-admin.php:55 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:55 +#: includes/class-swi-foot-admin.php:57 msgid "Match Data Cache Duration (seconds)" msgstr "Durée du cache des données de match (secondes)" -#: includes/class-swi-foot-admin.php:60 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:60 +#: includes/class-swi-foot-admin.php:62 msgid "Configure your Swiss Football API credentials here." -msgstr "" +msgstr "Configurez vos identifiants API Swiss Football ici." -#: includes/class-swi-foot-admin.php:65 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:65 +#: includes/class-swi-foot-admin.php:67 msgid "Configure caching settings for match data." -msgstr "" +msgstr "Configurez les paramètres de cache pour les données de match." -#: includes/class-swi-foot-admin.php:72 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:72 +#: includes/class-swi-foot-admin.php:74 msgid "The base URL for the Swiss Football API" -msgstr "" +msgstr "L'URL de base de l'API Swiss Football" -#: includes/class-swi-foot-admin.php:79 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:79 +#: includes/class-swi-foot-admin.php:81 #, fuzzy msgid "Your API application key" msgstr "Nom d'utilisateur API (Clé d'application)" -#: includes/class-swi-foot-admin.php:86 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:86 +#: includes/class-swi-foot-admin.php:88 #, fuzzy msgid "Your API application password" msgstr "Mot de passe API (Application Pass)" -#: includes/class-swi-foot-admin.php:93 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:93 +#: includes/class-swi-foot-admin.php:95 #, fuzzy msgid "Enter your club's Verein ID (Club ID)" msgstr "ID du club (Club ID)" -#: includes/class-swi-foot-admin.php:100 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:100 +#: includes/class-swi-foot-admin.php:102 msgid "Current season ID (usually the year)" -msgstr "" +msgstr "ID de saison actuelle (généralement l'année)" -#: includes/class-swi-foot-admin.php:107 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:107 +#: includes/class-swi-foot-admin.php:109 msgid "How long to cache match data in seconds (10-300)" -msgstr "" +msgstr "Combien de temps mettre en cache les données de match en secondes (10-300)" -#: includes/class-swi-foot-admin.php:175 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:175 +#: includes/class-swi-foot-admin.php:188 #, fuzzy msgid "Swiss Football Shortcodes" msgstr "Swiss Football" -#: includes/class-swi-foot-admin.php:187 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:187 +#: includes/class-swi-foot-admin.php:200 msgid "Available Shortcodes:" -msgstr "" +msgstr "Shortcodes disponibles:" -#: includes/class-swi-foot-admin.php:190 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:190 +#: includes/class-swi-foot-admin.php:203 msgid "Full Match Display:" -msgstr "" - -#: includes/class-swi-foot-admin.php:196 -msgid "Individual Match Elements:" -msgstr "" +msgstr "Affichage complet du match:" +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:196 #: includes/class-swi-foot-admin.php:209 +msgid "Individual Match Elements:" +msgstr "Éléments de match individuels:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:209 +#: includes/class-swi-foot-admin.php:222 msgid "Parameters:" -msgstr "" +msgstr "Paramètres:" -#: includes/class-swi-foot-admin.php:219 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:219 +#: includes/class-swi-foot-admin.php:232 msgid "Click any shortcode above to copy it to clipboard" -msgstr "" +msgstr "Cliquez sur n'importe quel shortcode ci-dessus pour le copier dans le presse-papiers" -#: includes/class-swi-foot-admin.php:227 includes/class-swi-foot-admin.php:237 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:227 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:237 +#: includes/class-swi-foot-admin.php:240 +#: includes/class-swi-foot-admin.php:250 msgid "Shortcode copied to clipboard!" -msgstr "" +msgstr "Shortcode copié dans le presse-papiers!" -#: includes/class-swi-foot-admin.php:260 -msgid "Connection Test" -msgstr "" - -#: includes/class-swi-foot-admin.php:263 -msgid "Test API Connection" -msgstr "Tester la connexion API" - -#: includes/class-swi-foot-admin.php:270 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:268 +#: includes/class-swi-foot-admin.php:281 msgid "Team Management" -msgstr "" +msgstr "Gestion d'équipe" -#: includes/class-swi-foot-admin.php:273 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:271 +#: includes/class-swi-foot-admin.php:284 msgid "Refresh Teams List" msgstr "Actualiser la liste des équipes" -#: includes/class-swi-foot-admin.php:284 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:282 +#: includes/class-swi-foot-admin.php:295 msgid "Cache Management" -msgstr "" +msgstr "Gestion du cache" -#: includes/class-swi-foot-admin.php:287 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:285 +#: includes/class-swi-foot-admin.php:298 msgid "Clear Match Data Cache" msgstr "Vider le cache des données de matchs" -#: includes/class-swi-foot-admin.php:295 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:293 +#: includes/class-swi-foot-admin.php:306 #, fuzzy msgid "Finished Matches Data" msgstr "Effacer tous les matchs terminés" -#: includes/class-swi-foot-admin.php:300 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:298 +#: includes/class-swi-foot-admin.php:311 msgid "Quick Shortcode Reference" -msgstr "" +msgstr "Référence rapide des shortcodes" -#: includes/class-swi-foot-admin.php:303 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:301 +#: includes/class-swi-foot-admin.php:314 msgid "Common Examples:" -msgstr "" +msgstr "Exemples courants:" -#: includes/class-swi-foot-admin.php:304 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:302 +#: includes/class-swi-foot-admin.php:315 msgid "Display full match info:" -msgstr "" +msgstr "Afficher les informations complètes du match:" -#: includes/class-swi-foot-admin.php:308 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:306 +#: includes/class-swi-foot-admin.php:319 msgid "Show next match for a team:" -msgstr "" +msgstr "Afficher le prochain match pour une équipe:" -#: includes/class-swi-foot-admin.php:312 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:310 +#: includes/class-swi-foot-admin.php:323 msgid "Individual elements in text:" -msgstr "" +msgstr "Éléments individuels dans le texte:" -#: includes/class-swi-foot-admin.php:313 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 msgid "The match between" -msgstr "" +msgstr "Le match entre" -#: includes/class-swi-foot-admin.php:313 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 msgid "and" -msgstr "" +msgstr "et" -#: includes/class-swi-foot-admin.php:313 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 msgid "is on" -msgstr "" +msgstr "est sur" -#: includes/class-swi-foot-admin.php:328 +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:326 +#: includes/class-swi-foot-admin.php:341 #, php-format msgid "Error loading teams: %s" -msgstr "" +msgstr "Erreur lors du chargement des équipes: %s" -#: includes/class-swi-foot-admin.php:335 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:333 +#: includes/class-swi-foot-admin.php:350 msgid "No teams found. Please check your API configuration." -msgstr "" +msgstr "Aucune équipe trouvée. Veuillez vérifier votre configuration API." -#: includes/class-swi-foot-admin.php:340 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:338 +#: includes/class-swi-foot-admin.php:355 msgid "Available Teams:" -msgstr "" +msgstr "Équipes disponibles:" -#: includes/class-swi-foot-admin.php:360 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:358 #, php-format msgid "Currently caching %d match records with %d second cache duration." msgstr "" -#: includes/class-swi-foot-admin.php:375 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:373 +#: includes/class-swi-foot-admin.php:395 msgid "Cache Range:" -msgstr "" +msgstr "Plage de cache:" -#: includes/class-swi-foot-admin.php:376 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:374 +#: includes/class-swi-foot-admin.php:396 msgid "Oldest:" -msgstr "" +msgstr "Le plus ancien:" -#: includes/class-swi-foot-admin.php:377 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:375 +#: includes/class-swi-foot-admin.php:397 msgid "Newest:" -msgstr "" +msgstr "Le plus récent:" -#: includes/class-swi-foot-admin.php:386 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:384 +#: includes/class-swi-foot-admin.php:406 msgid "No finished match data stored." msgstr "Aucune donnée de match terminé stockée." -#: includes/class-swi-foot-admin.php:393 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:391 +#: includes/class-swi-foot-admin.php:413 #, fuzzy msgid "Match ID" msgstr "Composition du match" -#: includes/class-swi-foot-admin.php:394 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:392 +#: includes/class-swi-foot-admin.php:414 msgid "Saved At" -msgstr "" +msgstr "Enregistré à" -#: includes/class-swi-foot-admin.php:395 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:393 +#: includes/class-swi-foot-admin.php:415 msgid "Players" -msgstr "" +msgstr "Joueurs" -#: includes/class-swi-foot-admin.php:396 -#: includes/class-swi-foot-shortcodes.php:768 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:394 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:920 +#: includes/class-swi-foot-admin.php:416 +#: includes/class-swi-foot-shortcodes.php:950 msgid "Bench" msgstr "Remplaçants" -#: includes/class-swi-foot-admin.php:397 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:395 +#: includes/class-swi-foot-admin.php:417 #, fuzzy msgid "Events" msgstr "Événements du match" -#: includes/class-swi-foot-admin.php:415 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:413 +#: includes/class-swi-foot-admin.php:435 msgid "Delete" msgstr "Supprimer" -#: includes/class-swi-foot-admin.php:421 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:419 +#: includes/class-swi-foot-admin.php:441 msgid "Clear All Finished Matches" msgstr "Effacer tous les matchs terminés" -#: includes/class-swi-foot-admin.php:428 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:426 +#: includes/class-swi-foot-admin.php:448 #, fuzzy msgid "Delete this finished match data?" msgstr "Aucune donnée de match terminé stockée." -#: includes/class-swi-foot-admin.php:445 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:443 +#: includes/class-swi-foot-admin.php:465 #, fuzzy msgid "Clear all finished match data?" msgstr "Effacer tous les matchs terminés" -#: includes/class-swi-foot-blocks.php:218 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:243 +#: includes/class-swi-foot-blocks.php:243 msgid "Standings: No team provided in container context." -msgstr "" +msgstr "Classement: Aucune équipe fournie dans le contexte du conteneur." -#: includes/class-swi-foot-blocks.php:226 +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:251 +#: includes/class-swi-foot-blocks.php:253 #, php-format msgid "Error loading standings: %s" -msgstr "" +msgstr "Erreur lors du chargement du classement: %s" -#: includes/class-swi-foot-blocks.php:231 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:256 +#: includes/class-swi-foot-blocks.php:260 msgid "No standings data available." msgstr "Aucun classement disponible." -#: includes/class-swi-foot-blocks.php:237 -#: includes/class-swi-foot-shortcodes.php:631 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:262 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:764 +#: includes/class-swi-foot-blocks.php:266 +#: includes/class-swi-foot-shortcodes.php:786 msgid "Current Standings" msgstr "Classement actuel" -#: includes/class-swi-foot-blocks.php:241 -#: includes/class-swi-foot-shortcodes.php:635 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:266 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:768 +#: includes/class-swi-foot-blocks.php:270 +#: includes/class-swi-foot-shortcodes.php:790 msgid "Pos" -msgstr "" +msgstr "Pos" -#: includes/class-swi-foot-blocks.php:242 -#: includes/class-swi-foot-shortcodes.php:636 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:267 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:769 +#: includes/class-swi-foot-blocks.php:271 +#: includes/class-swi-foot-shortcodes.php:791 #, fuzzy msgid "Team" msgstr "Équipe à domicile" -#: includes/class-swi-foot-blocks.php:243 -#: includes/class-swi-foot-shortcodes.php:637 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:268 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:770 +#: includes/class-swi-foot-blocks.php:272 +#: includes/class-swi-foot-shortcodes.php:792 msgid "P" -msgstr "" +msgstr "J" -#: includes/class-swi-foot-blocks.php:244 -#: includes/class-swi-foot-shortcodes.php:638 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:269 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:771 +#: includes/class-swi-foot-blocks.php:273 +#: includes/class-swi-foot-shortcodes.php:793 msgid "W" -msgstr "" +msgstr "G" -#: includes/class-swi-foot-blocks.php:245 -#: includes/class-swi-foot-shortcodes.php:639 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:270 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:772 +#: includes/class-swi-foot-blocks.php:274 +#: includes/class-swi-foot-shortcodes.php:794 msgid "D" -msgstr "" +msgstr "N" -#: includes/class-swi-foot-blocks.php:246 -#: includes/class-swi-foot-shortcodes.php:640 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:271 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:773 +#: includes/class-swi-foot-blocks.php:275 +#: includes/class-swi-foot-shortcodes.php:795 msgid "L" -msgstr "" +msgstr "P" -#: includes/class-swi-foot-blocks.php:247 -#: includes/class-swi-foot-shortcodes.php:641 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:272 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:774 +#: includes/class-swi-foot-blocks.php:276 +#: includes/class-swi-foot-shortcodes.php:796 msgid "GF" -msgstr "" +msgstr "BP" -#: includes/class-swi-foot-blocks.php:248 -#: includes/class-swi-foot-shortcodes.php:642 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:273 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:775 +#: includes/class-swi-foot-blocks.php:277 +#: includes/class-swi-foot-shortcodes.php:797 msgid "GA" -msgstr "" +msgstr "BC" -#: includes/class-swi-foot-blocks.php:249 -#: includes/class-swi-foot-shortcodes.php:643 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:274 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:776 +#: includes/class-swi-foot-blocks.php:278 +#: includes/class-swi-foot-shortcodes.php:798 msgid "Pts" -msgstr "" +msgstr "Pts" -#: includes/class-swi-foot-blocks.php:286 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:311 +#: includes/class-swi-foot-blocks.php:316 msgid "Schedule: No team provided in container context." -msgstr "" +msgstr "Calendrier: Aucune équipe fournie dans le contexte du conteneur." -#: includes/class-swi-foot-blocks.php:294 +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:319 +#: includes/class-swi-foot-blocks.php:326 #, php-format msgid "Error loading schedule: %s" -msgstr "" +msgstr "Erreur lors du chargement du calendrier: %s" -#: includes/class-swi-foot-blocks.php:314 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:339 +#: includes/class-swi-foot-blocks.php:373 msgid "Upcoming Matches" msgstr "Matchs à venir" -#: includes/class-swi-foot-blocks.php:316 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:341 +#: includes/class-swi-foot-blocks.php:375 msgid "No upcoming matches scheduled." msgstr "Aucun match à venir programmé." -#: includes/class-swi-foot-blocks.php:406 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:432 +#: includes/class-swi-foot-blocks.php:466 msgid "Match Roster: No match provided in container context." -msgstr "" +msgstr "Effectif du match: Aucun match fourni dans le contexte du conteneur." -#: includes/class-swi-foot-blocks.php:438 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:468 +#: includes/class-swi-foot-blocks.php:502 msgid "Match Events: No match provided in container context." -msgstr "" +msgstr "Événements du match: Aucun match fourni dans le contexte du conteneur." -#: includes/class-swi-foot-blocks.php:455 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:539 +#: includes/class-swi-foot-blocks.php:574 msgid "Please configure your API settings and ensure teams are available." -msgstr "" +msgstr "Veuillez configurer vos paramètres API et vous assurer que les équipes sont disponibles." -#: includes/class-swi-foot-blocks.php:462 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:546 +#: includes/class-swi-foot-blocks.php:581 #, php-format msgid "Please select a team to display %s:" -msgstr "" +msgstr "Veuillez sélectionner une équipe pour afficher %s:" -#: includes/class-swi-foot-blocks.php:464 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:548 +#: includes/class-swi-foot-blocks.php:583 msgid "Select a team..." -msgstr "" +msgstr "Sélectionnez une équipe..." -#: includes/class-swi-foot-shortcodes.php:201 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:223 +#: includes/class-swi-foot-shortcodes.php:223 #, fuzzy msgid "Match data not available" msgstr "Aucun classement disponible." -#: includes/class-swi-foot-shortcodes.php:440 src/format-shortcode.js:201 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 msgid "Ja" -msgstr "" +msgstr "Oui" -#: includes/class-swi-foot-shortcodes.php:440 src/format-shortcode.js:201 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 msgid "Nein" -msgstr "" +msgstr "Non" -#: includes/class-swi-foot-shortcodes.php:619 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:752 +#: includes/class-swi-foot-shortcodes.php:774 msgid "Team ID required" -msgstr "" +msgstr "ID d'équipe requis" -#: includes/class-swi-foot-shortcodes.php:625 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:758 +#: includes/class-swi-foot-shortcodes.php:780 #, fuzzy msgid "Standings data not available" msgstr "Aucun classement disponible." -#: includes/class-swi-foot-shortcodes.php:679 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:814 +#: includes/class-swi-foot-shortcodes.php:836 msgid "Parameter \"side\" must be \"home\" or \"away\"" msgstr "" -#: includes/class-swi-foot-shortcodes.php:691 -#: includes/class-swi-foot-shortcodes.php:812 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:426 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:495 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:826 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:976 +#: includes/class-swi-foot-shortcodes.php:427 +#: includes/class-swi-foot-shortcodes.php:517 +#: includes/class-swi-foot-shortcodes.php:848 +#: includes/class-swi-foot-shortcodes.php:1006 msgid "Match ID required" -msgstr "" +msgstr "ID du match requis" -#: includes/class-swi-foot-shortcodes.php:703 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:846 #, fuzzy msgid "Roster data not available" msgstr "Aucun classement disponible." -#: includes/class-swi-foot-shortcodes.php:743 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:888 +#: includes/class-swi-foot-shortcodes.php:910 #, fuzzy msgid "Team Roster" msgstr "Composition du match" -#: includes/class-swi-foot-shortcodes.php:764 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:945 +#: includes/class-swi-foot-shortcodes.php:975 #, fuzzy msgid "No roster data available." msgstr "Aucun classement disponible." -#: includes/class-swi-foot-shortcodes.php:822 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:986 #, fuzzy msgid "Events data not available" msgstr "Aucun classement disponible." -#: includes/class-swi-foot-shortcodes.php:882 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1046 +#: includes/class-swi-foot-shortcodes.php:1076 #, fuzzy msgid "Live match events" msgstr "Événements du match" -#: includes/class-swi-foot-shortcodes.php:883 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1047 +#: includes/class-swi-foot-shortcodes.php:1077 +#: src/editor-blocks.js:237 msgid "Match Events" msgstr "Événements du match" -#: includes/class-swi-foot-shortcodes.php:889 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1053 +#: includes/class-swi-foot-shortcodes.php:1083 #, fuzzy msgid "Match minute" msgstr "Événements du match" -#: includes/class-swi-foot-shortcodes.php:950 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1114 +#: includes/class-swi-foot-shortcodes.php:1144 msgid "No events recorded yet." msgstr "Aucun événement enregistré." -#: src/editor-blocks.js:59 +#: src/editor-blocks.js:76 +#: src/editor-blocks.js:311 msgid "Settings" -msgstr "" +msgstr "Paramètres" -#: src/editor-blocks.js:60 src/editor-blocks.js:80 +#: src/editor-blocks.js:77 +#: src/editor-blocks.js:109 msgid "Team is inherited from the container context." -msgstr "" +msgstr "L'équipe est héritée du contexte du conteneur." -#: src/editor-blocks.js:63 -msgid "Standings will render on the front-end." -msgstr "" - -#: src/editor-blocks.js:79 +#: src/editor-blocks.js:108 msgid "Schedule settings" -msgstr "" +msgstr "Paramètres du calendrier" -#: src/editor-blocks.js:81 +#: src/editor-blocks.js:110 msgid "Limit" -msgstr "" +msgstr "Limite" -#: src/editor-blocks.js:84 -msgid "Upcoming matches will render on the front-end." -msgstr "" - -#: src/editor-blocks.js:99 +#: assets/editor-blocks.js:30 +#: assets/editor-blocks.js:258 #, fuzzy msgid "Swiss Football Team Data" msgstr "Swiss Football" -#: src/editor-blocks.js:126 +#: assets/editor-blocks.js:154 msgid "Team Selection" -msgstr "" +msgstr "Sélection d'équipe" -#: src/editor-blocks.js:128 +#: assets/editor-blocks.js:157 msgid "1. Select Team" -msgstr "" +msgstr "1. Sélectionnez une équipe" -#: src/editor-blocks.js:129 +#: assets/editor-blocks.js:159 +#: assets/editor-blocks.js:423 +#: assets/editor-blocks.js:576 msgid "Choose a team..." -msgstr "" +msgstr "Choisissez une équipe..." -#: src/editor-blocks.js:133 -msgid "2. What to display" -msgstr "" - -#: src/editor-blocks.js:133 -msgid "Choose..." -msgstr "" - -#: src/editor-blocks.js:133 +#: src/editor-blocks.js:81 #, fuzzy msgid "Standings" msgstr "Classement actuel" -#: src/editor-blocks.js:133 -#, fuzzy -msgid "Match" -msgstr "Composition du match" - -#: src/editor-blocks.js:138 -msgid "Team data shortcode generator" -msgstr "" - -#: src/editor-blocks.js:161 +#: assets/editor-blocks.js:331 +#: src/editor-blocks.js:137 msgid "Swiss Football Match Roster" msgstr "Feuille d'équipe du football suisse" -#: src/editor-blocks.js:168 src/editor-blocks.js:206 +#: src/editor-blocks.js:152 +#: src/editor-blocks.js:211 +#: src/editor-blocks.js:272 msgid "Display Options" -msgstr "" +msgstr "Options d'affichage" -#: src/editor-blocks.js:169 src/editor-blocks.js:207 +#: src/editor-blocks.js:153 +#: src/editor-blocks.js:212 msgid "Match and team are inherited from the container context." -msgstr "" +msgstr "Le match et l'équipe sont hérités du contexte du conteneur." -#: src/editor-blocks.js:171 +#: src/editor-blocks.js:155 +#: src/editor-blocks.js:275 #, fuzzy msgid "Team Side" msgstr "Équipe à domicile" -#: src/editor-blocks.js:173 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:453 +#: includes/class-swi-foot-shortcodes.php:468 +#: assets/editor-blocks.js:447 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 #, fuzzy msgid "Home Team" msgstr "Équipe à domicile" -#: src/editor-blocks.js:173 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:466 +#: includes/class-swi-foot-shortcodes.php:485 +#: assets/editor-blocks.js:448 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 msgid "Away Team" msgstr "Équipe à l'extérieur" -#: src/editor-blocks.js:177 +#: assets/editor-blocks.js:455 msgid "Include Bench Players" -msgstr "" +msgstr "Inclure les joueurs du banc" -#: src/editor-blocks.js:183 -msgid "Match roster will render on the front-end." -msgstr "" - -#: src/editor-blocks.js:199 +#: assets/editor-blocks.js:508 +#: src/editor-blocks.js:197 msgid "Swiss Football Match Events" msgstr "Événements des matchs de football suisse" -#: src/editor-blocks.js:209 +#: assets/editor-blocks.js:597 +#: src/editor-blocks.js:214 msgid "Refresh Interval (seconds)" -msgstr "" +msgstr "Intervalle de rafraîchissement (secondes)" -#: src/editor-blocks.js:217 +#: src/editor-blocks.js:222 msgid "Event Order" msgstr "Ordre des événements" -#: src/editor-blocks.js:221 +#: src/editor-blocks.js:226 msgid "Dynamic (Newest first while live, chronological after)" msgstr "Dynamique (Les plus récents en premier pendant le match, chronologiquement après)" -#: src/editor-blocks.js:222 +#: src/editor-blocks.js:227 msgid "Newest First" msgstr "Les plus récents en premier" -#: src/editor-blocks.js:223 +#: src/editor-blocks.js:228 msgid "Oldest First" msgstr "Les plus anciens en premier" -#: src/editor-blocks.js:225 -msgid "" -"Dynamic: newest events at top while match is ongoing, chronological (oldest " -"first) after match ends" -msgstr "" -"Dynamique : les plus récents en haut pendant le match, chronologiquement " -"(les plus anciens en premier) après la fin du match" - -#: src/editor-blocks.js:229 -msgid "Live events will be displayed on the front-end." -msgstr "" +#: src/editor-blocks.js:230 +msgid "Dynamic: newest events at top while match is ongoing, chronological (oldest first) after match ends" +msgstr "Dynamique : les plus récents en haut pendant le match, chronologiquement (les plus anciens en premier) après la fin du match" #: src/format-shortcode.js:31 msgid "— Select data point…" -msgstr "" +msgstr "— Sélectionnez un point de données…" #: src/format-shortcode.js:32 msgid "Match-Typ" -msgstr "" +msgstr "Type de match" #: src/format-shortcode.js:33 msgid "Liga" -msgstr "" +msgstr "Ligue" #: src/format-shortcode.js:34 msgid "Gruppe" -msgstr "" +msgstr "Groupe" #: src/format-shortcode.js:35 msgid "Runde" -msgstr "" +msgstr "Tour" #: src/format-shortcode.js:36 msgid "Spielfeld" -msgstr "" +msgstr "Terrain" #: src/format-shortcode.js:37 msgid "Heimteam" -msgstr "" +msgstr "Équipe à domicile" #: src/format-shortcode.js:38 msgid "Gastteam" -msgstr "" +msgstr "Équipe en déplacement" #: src/format-shortcode.js:39 msgid "Tore Heim" -msgstr "" +msgstr "Buts à domicile" #: src/format-shortcode.js:40 msgid "Tore Gast" -msgstr "" +msgstr "Buts en déplacement" #: src/format-shortcode.js:41 msgid "Tore Halbzeit Heim" -msgstr "" +msgstr "Buts mi-temps à domicile" #: src/format-shortcode.js:42 msgid "Tore Halbzeit Gast" -msgstr "" +msgstr "Buts mi-temps en déplacement" #: src/format-shortcode.js:43 msgid "Spieltag" -msgstr "" +msgstr "Jour du match" #: src/format-shortcode.js:44 msgid "Spielzeit" -msgstr "" +msgstr "Heure du match" #: src/format-shortcode.js:45 msgid "Spielstatus" -msgstr "" +msgstr "Statut du match" #: src/format-shortcode.js:46 msgid "Spiel pausiert" -msgstr "" +msgstr "Match en pause" #: src/format-shortcode.js:47 msgid "Spiel beendet" -msgstr "" +msgstr "Match terminé" #: src/format-shortcode.js:52 msgid "— Select shortcode…" -msgstr "" +msgstr "— Sélectionnez un shortcode…" #: src/format-shortcode.js:53 msgid "Heimteam Logo" @@ -642,16 +736,19 @@ msgstr "Logo de l'équipe à domicile (URL)" msgid "Gastteam Logo (URL)" msgstr "Logo de l'équipe en déplacement (URL)" -#: src/format-shortcode.js:229 src/format-shortcode.js:242 -#: src/format-shortcode.js:356 src/format-shortcode.js:390 +#: src/format-shortcode.js:229 +#: src/format-shortcode.js:242 +#: src/format-shortcode.js:360 +#: src/format-shortcode.js:394 #, fuzzy msgid "Insert Match Data" msgstr "Effacer tous les matchs terminés" #: src/format-shortcode.js:234 msgid "No match data available on this page. Please add match context first." -msgstr "" +msgstr "Aucune donnée de match disponible sur cette page. Veuillez d'abord ajouter un contexte de match." +#: assets/editor-blocks.js:135 #: src/format-shortcode.js:255 #, fuzzy msgid "Match Data" @@ -663,42 +760,556 @@ msgstr "" #: src/format-shortcode.js:278 msgid "Data Point" -msgstr "" +msgstr "Point de données" #: src/format-shortcode.js:282 msgid "Select which match data to display" -msgstr "" +msgstr "Sélectionnez les données du match à afficher" -#: src/format-shortcode.js:289 +#: src/format-shortcode.js:291 msgid "Preview:" -msgstr "" +msgstr "Aperçu:" -#: src/format-shortcode.js:297 +#: src/format-shortcode.js:299 msgid "(no value)" -msgstr "" +msgstr "(aucune valeur)" -#: src/format-shortcode.js:307 +#: src/format-shortcode.js:309 msgid "Insert Data" -msgstr "" +msgstr "Insérer les données" -#: src/format-shortcode.js:320 +#: src/format-shortcode.js:322 msgid "Shortcode" -msgstr "" +msgstr "Shortcode" -#: src/format-shortcode.js:324 +#: src/format-shortcode.js:326 msgid "Select a shortcode to insert (logos, etc.)" -msgstr "" +msgstr "Sélectionnez un shortcode à insérer (logos, etc.)" -#: src/format-shortcode.js:331 +#: src/format-shortcode.js:335 msgid "Shortcode:" -msgstr "" +msgstr "Shortcode:" -#: src/format-shortcode.js:341 +#: src/format-shortcode.js:345 msgid "Insert Shortcode" +msgstr "Insérer un shortcode" + +#. Plugin Name of the plugin +#: swiss-football-matchdata.php +msgid "Swiss Football Matchdata" +msgstr "Swiss Football Matchdata" + +#. Description of the plugin +#: swiss-football-matchdata.php +msgid "WordPress plugin to consume Swiss Football Association API for team standings, schedules, and match details with shortcode support" +msgstr "Plugin WordPress pour consommer l'API de l'Association suisse de football pour les classements d'équipes, les calendriers et les détails des matchs avec support des codes courts" + +#. Author of the plugin +#: swiss-football-matchdata.php +msgid "David Reindl (assisted by Claude AI)" +msgstr "David Reindl (assisté par Claude AI)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:258 +#: includes/class-swi-foot-admin.php:271 +msgid "Save and Test" +msgstr "Enregistrer et tester" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:261 +#: includes/class-swi-foot-admin.php:274 +msgid "Save without Test" +msgstr "Enregistrer sans test" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:495 +#: includes/class-swi-foot-blocks.php:530 +msgid "Match Bench: No match provided in container context." +msgstr "Banc du match: Aucun match fourni dans le contexte du conteneur." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:522 +#: includes/class-swi-foot-blocks.php:557 +msgid "Match Referees: No match provided in container context." +msgstr "Arbitres du match: Aucun match fourni dans le contexte du conteneur." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:62 +#: includes/class-swi-foot-rest.php:427 +#: includes/class-swi-foot-shortcodes.php:62 +msgid "Data not yet available" +msgstr "Données non encore disponibles" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:436 +#: includes/class-swi-foot-shortcodes.php:437 +msgid "No bench data available" +msgstr "Aucune donnée de banc disponible" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:505 +msgid "No referees data available" +msgstr "Aucune donnée d'arbitre disponible" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:882 +#: includes/class-swi-foot-shortcodes.php:904 +msgid "No roster display options selected" +msgstr "Aucune option d'affichage d'effectif sélectionnée" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:892 +#: includes/class-swi-foot-shortcodes.php:914 +msgid "Starting Squad" +msgstr "Équipe de départ" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:943 +#: includes/class-swi-foot-shortcodes.php:973 +msgid "No roster data to display." +msgstr "Aucune donnée d'effectif à afficher." + +#: includes/class-swi-foot-admin.php:48 +msgid "API Response Language" msgstr "" -#~ msgid "Display match roster for a selected match and side." -#~ msgstr "Afficher l'effectif pour un match et une équipe sélectionnés." +#: includes/class-swi-foot-admin.php:116 +msgid "German" +msgstr "Allemand" -#~ msgid "Live match events with optional auto-refresh." -#~ msgstr "Événements en direct avec actualisation automatique optionnelle." +#: includes/class-swi-foot-admin.php:117 +msgid "French" +msgstr "Français" + +#: includes/class-swi-foot-admin.php:118 +msgid "Italian" +msgstr "Italien" + +#: includes/class-swi-foot-admin.php:120 +msgid "Select the language for API responses (German, French, or Italian)" +msgstr "Sélectionnez la langue pour les réponses API (allemand, français ou italien)" + +#. translators: %1$d is the number of cached match records, %2$d is the cache duration in seconds +#: includes/class-swi-foot-admin.php:377 +#, php-format +msgid "Currently caching %1$d match records with %2$d second cache duration." +msgstr "Mise en cache actuellement %1$d enregistrements de match avec une durée de cache de %2$d secondes." + +#: includes/class-swi-foot-rest.php:417 +msgid "Unknown endpoint" +msgstr "Point de terminaison inconnu" + +#: includes/class-swi-foot-rest.php:429 +#: includes/class-swi-foot-rest.php:432 +#: includes/class-swi-foot-shortcodes.php:66 +#: includes/class-swi-foot-shortcodes.php:527 +msgid "No data available" +msgstr "Aucune donnée disponible" + +#: includes/class-swi-foot-rest.php:434 +msgid "Data available" +msgstr "Données disponibles" + +#: includes/class-swi-foot-shortcodes.php:929 +msgid "Captain" +msgstr "Capitaine" + +#: assets/editor-blocks.js:31 +msgid "Display team standings or match data with guided selection" +msgstr "Afficher le classement du team ou les données du match avec sélection guidée" + +#: assets/editor-blocks.js:35 +msgid "football" +msgstr "Football" + +#: assets/editor-blocks.js:36 +msgid "soccer" +msgstr "Football" + +#: assets/editor-blocks.js:37 +#: assets/editor-blocks.js:339 +msgid "team" +msgstr "Équipe" + +#: assets/editor-blocks.js:38 +msgid "swiss" +msgstr "Suisse" + +#: assets/editor-blocks.js:133 +msgid "Choose what to display..." +msgstr "Choisissez ce que vous voulez afficher..." + +#: assets/editor-blocks.js:134 +msgid "Team Statistics (Standings/Ranking)" +msgstr "Statistiques d'équipe (Classement/Classement)" + +#: assets/editor-blocks.js:140 +msgid "Complete Match Information" +msgstr "Informations complètes du match" + +#: assets/editor-blocks.js:141 +msgid "Home Team Name Only" +msgstr "Nom de l'équipe à domicile uniquement" + +#: assets/editor-blocks.js:142 +msgid "Away Team Name Only" +msgstr "Nom de l'équipe en déplacement uniquement" + +#: assets/editor-blocks.js:143 +msgid "Match Date Only" +msgstr "Date du match uniquement" + +#: assets/editor-blocks.js:144 +msgid "Match Time Only" +msgstr "Heure du match uniquement" + +#: assets/editor-blocks.js:145 +msgid "Venue/Location Only" +msgstr "Lieu/Localisation uniquement" + +#: assets/editor-blocks.js:146 +msgid "Score Only" +msgstr "Score uniquement" + +#: assets/editor-blocks.js:147 +msgid "Match Status Only" +msgstr "Statut du match uniquement" + +#: assets/editor-blocks.js:148 +msgid "League Name Only" +msgstr "Nom de la ligue uniquement" + +#: assets/editor-blocks.js:149 +msgid "Round Number Only" +msgstr "Numéro du tour uniquement" + +#: assets/editor-blocks.js:176 +msgid "2. What would you like to display?" +msgstr "2. Que voulez-vous afficher?" + +#: assets/editor-blocks.js:189 +msgid "Match Settings" +msgstr "" + +#: assets/editor-blocks.js:192 +msgid "3. Select Match" +msgstr "3. Sélectionnez un match" + +#: assets/editor-blocks.js:194 +#: assets/editor-blocks.js:435 +#: assets/editor-blocks.js:587 +msgid "Choose a match..." +msgstr "Choisissez un match..." + +#: assets/editor-blocks.js:195 +msgid "Current Match (Next upcoming or recent)" +msgstr "Match actuel (Prochain à venir ou récent)" + +#: assets/editor-blocks.js:206 +msgid "4. What match information to display?" +msgstr "4. Quelles informations de match afficher?" + +#: assets/editor-blocks.js:214 +msgid "Advanced Options" +msgstr "Options avancées" + +#: assets/editor-blocks.js:216 +msgid "Date/Time Format" +msgstr "Format Date/Heure" + +#: assets/editor-blocks.js:219 +#: assets/editor-blocks.js:225 +msgid "Default (WordPress setting)" +msgstr "Par défaut (paramètre WordPress)" + +#: assets/editor-blocks.js:234 +msgid "Score Separator" +msgstr "Séparateur de score" + +#: assets/editor-blocks.js:261 +msgid "1. Please select a team to get started" +msgstr "1. Veuillez sélectionner une équipe pour commencer" + +#: assets/editor-blocks.js:265 +msgid "2. Please choose what you want to display" +msgstr "2. Veuillez choisir ce que vous voulez afficher" + +#: assets/editor-blocks.js:269 +msgid "Will display team standings/ranking" +msgstr "Affichera le classement/classement du team" + +#: assets/editor-blocks.js:273 +msgid "3. Please select a match" +msgstr "3. Veuillez sélectionner un match" + +#: assets/editor-blocks.js:278 +msgid "Ready to display match data" +msgstr "Prêt à afficher les données du match" + +#: assets/editor-blocks.js:281 +msgid "Generated shortcode:" +msgstr "Shortcode généré:" + +#: assets/editor-blocks.js:332 +msgid "Display match roster for home or away team, with optional bench players" +msgstr "Afficher l'effectif du match pour l'équipe à domicile ou en déplacement, avec des joueurs de banc en option" + +#: assets/editor-blocks.js:336 +msgid "roster" +msgstr "Effectif" + +#: assets/editor-blocks.js:337 +msgid "players" +msgstr "Joueurs" + +#: assets/editor-blocks.js:338 +msgid "lineup" +msgstr "Formation" + +#: assets/editor-blocks.js:417 +#: assets/editor-blocks.js:572 +msgid "Match Selection" +msgstr "Sélection du match" + +#: assets/editor-blocks.js:421 +#: assets/editor-blocks.js:574 +msgid "Select Team" +msgstr "Sélectionnez une équipe" + +#: assets/editor-blocks.js:433 +#: assets/editor-blocks.js:585 +msgid "Select Match" +msgstr "Sélectionnez un match" + +#: assets/editor-blocks.js:436 +#: assets/editor-blocks.js:588 +msgid "Current Match" +msgstr "Match actuel" + +#: assets/editor-blocks.js:444 +msgid "Select Side" +msgstr "Sélectionnez le côté" + +#: assets/editor-blocks.js:456 +msgid "When enabled, bench players will also be displayed" +msgstr "Lorsqu'elle est activée, les joueurs du banc seront également affichés" + +#: assets/editor-blocks.js:473 +#: src/editor-blocks.js:177 +msgid "Match Roster" +msgstr "Effectif du match" + +#: assets/editor-blocks.js:476 +msgid "Please select team, match, side, and bench option" +msgstr "Veuillez sélectionner l'équipe, le match, le côté et l'option de banc" + +#: assets/editor-blocks.js:509 +msgid "Display live match events with auto-refresh" +msgstr "Afficher les événements de match en direct avec actualisation automatique" + +#: assets/editor-blocks.js:513 +msgid "events" +msgstr "Événements" + +#: assets/editor-blocks.js:514 +msgid "live" +msgstr "Direct" + +#: assets/editor-blocks.js:515 +msgid "timeline" +msgstr "Chronologie" + +#: assets/editor-blocks.js:516 +msgid "match" +msgstr "Match" + +#: assets/editor-blocks.js:595 +msgid "Auto-Refresh Settings" +msgstr "Paramètres d'actualisation automatique" + +#: assets/editor-blocks.js:616 +msgid "Live Match Events" +msgstr "Événements de match en direct" + +#: assets/editor-blocks.js:618 +msgid "Please select team and match" +msgstr "Veuillez sélectionner l'équipe et le match" + +#: assets/editor-blocks.js:620 +msgid "Will display live match events" +msgstr "Affichera les événements de match en direct" + +#: assets/editor-blocks.js:622 +msgid "Auto-refresh every" +msgstr "Actualiser automatiquement chaque" + +#: assets/editor-blocks.js:622 +msgid "seconds" +msgstr "Secondes" + +#: src/editor-blocks.js:68 +msgid "Swiss Football Standings" +msgstr "Classement Swiss Football" + +#: src/editor-blocks.js:82 +msgid "League standings inherited from team context. ✓ Data will render on the front-end." +msgstr "Classements de la ligue hérités du contexte de l'équipe. ✓ Les données s'affichent sur le front-end." + +#: src/editor-blocks.js:94 +msgid "Swiss Football Schedule" +msgstr "Calendrier Swiss Football" + +#: src/editor-blocks.js:124 +msgid "Schedule" +msgstr "" + +#: src/editor-blocks.js:125 +msgid "Team and match schedule inherited from context. ✓ Data will render on the front-end." +msgstr "Calendrier d'équipe et de match hérité du contexte. ✓ Les données s'affichent sur le front-end." + +#: src/editor-blocks.js:163 +msgid "Show Starting Squad" +msgstr "" + +#: src/editor-blocks.js:169 +msgid "Show Bench" +msgstr "" + +#: src/editor-blocks.js:178 +msgid "Team and match are inherited from the container context. ✓ Data will render on the front-end." +msgstr "L'équipe et le match sont hérités du contexte du conteneur. ✓ Les données s'affichent sur le front-end." + +#: src/editor-blocks.js:238 +msgid "Live match events inherited from context. ✓ Will update during match." +msgstr "Événements de match en direct hérités du contexte. ✓ Seront mises à jour pendant le match." + +#: src/editor-blocks.js:258 +msgid "Swiss Football Match Bench" +msgstr "Banc du match Swiss Football" + +#: src/editor-blocks.js:273 +#: src/editor-blocks.js:312 +msgid "Match is inherited from the container context." +msgstr "Le match est hérité du contexte du conteneur." + +#: src/editor-blocks.js:285 +msgid "Match Bench" +msgstr "Banc du match" + +#: src/editor-blocks.js:286 +msgid "Team bench and substitutes inherited from context. ✓ Data will render on the front-end." +msgstr "Banc d'équipe et remplaçants hérités du contexte. ✓ Les données s'affichent sur le front-end." + +#: src/editor-blocks.js:302 +msgid "Swiss Football Match Referees" +msgstr "Arbitres du match Swiss Football" + +#: src/editor-blocks.js:316 +msgid "Match Referees" +msgstr "Arbitres du match" + +#: src/editor-blocks.js:317 +msgid "Match officials and referees inherited from context. ✓ Data will render on the front-end." +msgstr "Officiels de match et arbitres hérités du contexte. ✓ Les données s'affichent sur le front-end." + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block title" +msgid "Swiss Football Context (container)" +msgstr "Contexte Swiss Football (conteneur)" + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block description" +msgid "Provides a team/season/match context to child blocks. Children will inherit these settings unless they override them." +msgstr "Fournit un contexte d'équipe/saison/match aux blocs enfants. Les blocs enfants hériteront de ces paramètres sauf s'ils les remplacent." + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block title" +msgid "Swiss Football Match Bench" +msgstr "" + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block description" +msgid "Display team staff and substitutes for a match" +msgstr "Afficher le personnel de l'équipe et les remplaçants pour un match" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block title" +msgid "Swiss Football Match Events" +msgstr "Événements du match Swiss Football" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block description" +msgid "Live match events with optional auto-refresh." +msgstr "Événements de match en direct avec actualisation automatique en option." + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block title" +msgid "Swiss Football Match Referees" +msgstr "" + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block description" +msgid "Display match officials and referees" +msgstr "Afficher les officiels de match et les arbitres" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block title" +msgid "Swiss Football Match Roster" +msgstr "Effectif du match Swiss Football" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block description" +msgid "Display match roster for a selected match and side." +msgstr "Afficher l'effectif du match pour un match et un côté sélectionnés." + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block title" +msgid "Swiss Football Schedule" +msgstr "" + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block description" +msgid "Display upcoming matches for a team." +msgstr "Afficher les matchs à venir pour une équipe." + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block title" +msgid "SWI Football Shortcode Inserter" +msgstr "SWI Football Shortcode Inserter" + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block description" +msgid "Insert shortcode-based match or team displays." +msgstr "Insérer des affichages de match ou d'équipe basés sur des shortcodes." + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block title" +msgid "Swiss Football Standings" +msgstr "" + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block description" +msgid "Display current standings for a team." +msgstr "Afficher les classements actuels pour une équipe." + +#: src/editor-blocks.js:112 +msgid "Match Filter" +msgstr "Filtre de match" + +#: src/editor-blocks.js:115 +msgid "All Matches" +msgstr "Tous les matchs" + +#: src/editor-blocks.js:116 +msgid "Home Matches Only" +msgstr "Matchs à domicile uniquement" + +#: src/editor-blocks.js:117 +msgid "Away Matches Only" +msgstr "Matchs en déplacement uniquement" diff --git a/languages/swi_foot_matchdata-it_IT.mo b/languages/swi_foot_matchdata-it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..52fd9bb31eb9447fda4eacd28304b2f4514a1a00 GIT binary patch literal 20322 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 literal 0 HcmV?d00001 diff --git a/languages/swi_foot_matchdata-it_IT.po b/languages/swi_foot_matchdata-it_IT.po new file mode 100644 index 0000000..4c9993b --- /dev/null +++ b/languages/swi_foot_matchdata-it_IT.po @@ -0,0 +1,1292 @@ +msgid "" +msgstr "" +"Project-Id-Version: Swiss Football Matchdata 1.0.0\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/swiss-football-matchdata\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-03-27T11:19:41+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Language: \n" +"X-Generator: WP-CLI 2.12.0\n" +"X-Domain: swi_foot_matchdata\n" + +#. Plugin Name of the plugin +#: swiss-football-matchdata.php +msgid "Swiss Football Matchdata" +msgstr "Swiss Football Matchdata" + +#. Description of the plugin +#: swiss-football-matchdata.php +msgid "WordPress plugin to consume Swiss Football Association API for team standings, schedules, and match details with shortcode support" +msgstr "Plugin WordPress per utilizzare l'API dell'Associazione calcistica svizzera per classifiche delle squadre, calendari e dettagli delle partite con supporto shortcode" + +#. Author of the plugin +#: swiss-football-matchdata.php +msgid "David Reindl (assisted by Claude AI)" +msgstr "David Reindl (assistito da Claude AI)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:18 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:249 +#: includes/class-swi-foot-admin.php:18 +#: includes/class-swi-foot-admin.php:262 +msgid "Swiss Football Matchdata Settings" +msgstr "Impostazioni Swiss Football Matchdata" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:19 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:31 +#: includes/class-swi-foot-admin.php:19 +#: includes/class-swi-foot-blocks.php:31 +msgid "Swiss Football" +msgstr "Swiss Football" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:37 +#: includes/class-swi-foot-admin.php:38 +msgid "API Configuration" +msgstr "Configurazione API" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:42 +#: includes/class-swi-foot-admin.php:43 +msgid "API Base URL" +msgstr "URL di base dell'API" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:43 +#: includes/class-swi-foot-admin.php:44 +msgid "API Username (Application Key)" +msgstr "Nome utente API (Chiave applicazione)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:44 +#: includes/class-swi-foot-admin.php:45 +msgid "API Password (Application Pass)" +msgstr "Password API (Pass applicazione)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:45 +#: includes/class-swi-foot-admin.php:46 +msgid "Verein ID (Club ID)" +msgstr "ID Club (Club ID)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:46 +#: includes/class-swi-foot-admin.php:47 +msgid "Season ID" +msgstr "ID Stagione" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:50 +#: includes/class-swi-foot-admin.php:52 +msgid "Cache Settings" +msgstr "Impostazioni cache" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:55 +#: includes/class-swi-foot-admin.php:57 +msgid "Match Data Cache Duration (seconds)" +msgstr "Durata Cache Dati Partita (secondi)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:60 +#: includes/class-swi-foot-admin.php:62 +msgid "Configure your Swiss Football API credentials here." +msgstr "Configura le credenziali dell'API Swiss Football qui." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:65 +#: includes/class-swi-foot-admin.php:67 +msgid "Configure caching settings for match data." +msgstr "Configura le impostazioni di cache per i dati della partita." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:72 +#: includes/class-swi-foot-admin.php:74 +msgid "The base URL for the Swiss Football API" +msgstr "L'URL di base per l'API Swiss Football" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:79 +#: includes/class-swi-foot-admin.php:81 +msgid "Your API application key" +msgstr "La tua chiave di applicazione API" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:86 +#: includes/class-swi-foot-admin.php:88 +msgid "Your API application password" +msgstr "La tua password di applicazione API" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:93 +#: includes/class-swi-foot-admin.php:95 +msgid "Enter your club's Verein ID (Club ID)" +msgstr "Inserisci l'ID del club (Club ID) del tuo club" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:100 +#: includes/class-swi-foot-admin.php:102 +msgid "Current season ID (usually the year)" +msgstr "ID stagione attuale (solitamente l'anno)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:107 +#: includes/class-swi-foot-admin.php:109 +msgid "How long to cache match data in seconds (10-300)" +msgstr "Per quanto tempo memorizzare i dati della partita in secondi (10-300)" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:175 +#: includes/class-swi-foot-admin.php:188 +msgid "Swiss Football Shortcodes" +msgstr "Shortcode Swiss Football" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:187 +#: includes/class-swi-foot-admin.php:200 +msgid "Available Shortcodes:" +msgstr "Shortcode disponibili:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:190 +#: includes/class-swi-foot-admin.php:203 +msgid "Full Match Display:" +msgstr "Visualizzazione completa della partita:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:196 +#: includes/class-swi-foot-admin.php:209 +msgid "Individual Match Elements:" +msgstr "Elementi della partita individuali:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:209 +#: includes/class-swi-foot-admin.php:222 +msgid "Parameters:" +msgstr "Parametri:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:219 +#: includes/class-swi-foot-admin.php:232 +msgid "Click any shortcode above to copy it to clipboard" +msgstr "Fai clic su qualsiasi shortcode sopra per copiarlo negli appunti" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:227 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:237 +#: includes/class-swi-foot-admin.php:240 +#: includes/class-swi-foot-admin.php:250 +msgid "Shortcode copied to clipboard!" +msgstr "Shortcode copiato negli appunti!" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:258 +#: includes/class-swi-foot-admin.php:271 +msgid "Save and Test" +msgstr "Salva e testa" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:261 +#: includes/class-swi-foot-admin.php:274 +msgid "Save without Test" +msgstr "Salva senza test" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:268 +#: includes/class-swi-foot-admin.php:281 +msgid "Team Management" +msgstr "Gestione della squadra" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:271 +#: includes/class-swi-foot-admin.php:284 +msgid "Refresh Teams List" +msgstr "Aggiorna elenco squadre" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:282 +#: includes/class-swi-foot-admin.php:295 +msgid "Cache Management" +msgstr "Gestione cache" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:285 +#: includes/class-swi-foot-admin.php:298 +msgid "Clear Match Data Cache" +msgstr "Cancella cache dati partita" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:293 +#: includes/class-swi-foot-admin.php:306 +msgid "Finished Matches Data" +msgstr "Dati partite terminate" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:298 +#: includes/class-swi-foot-admin.php:311 +msgid "Quick Shortcode Reference" +msgstr "Riferimento rapido Shortcode" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:301 +#: includes/class-swi-foot-admin.php:314 +msgid "Common Examples:" +msgstr "Esempi comuni:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:302 +#: includes/class-swi-foot-admin.php:315 +msgid "Display full match info:" +msgstr "Visualizza informazioni complete della partita:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:306 +#: includes/class-swi-foot-admin.php:319 +msgid "Show next match for a team:" +msgstr "Mostra la prossima partita di una squadra:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:310 +#: includes/class-swi-foot-admin.php:323 +msgid "Individual elements in text:" +msgstr "Elementi individuali nel testo:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 +msgid "The match between" +msgstr "La partita tra" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 +msgid "and" +msgstr "e" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 +msgid "is on" +msgstr "è su" + +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:326 +#: includes/class-swi-foot-admin.php:341 +#, php-format +msgid "Error loading teams: %s" +msgstr "Errore nel caricamento delle squadre: %s" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:333 +#: includes/class-swi-foot-admin.php:350 +msgid "No teams found. Please check your API configuration." +msgstr "Nessuna squadra trovata. Controlla la configurazione dell'API." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:338 +#: includes/class-swi-foot-admin.php:355 +msgid "Available Teams:" +msgstr "Squadre disponibili:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:358 +#, php-format +msgid "Currently caching %d match records with %d second cache duration." +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:373 +#: includes/class-swi-foot-admin.php:395 +msgid "Cache Range:" +msgstr "Intervallo cache:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:374 +#: includes/class-swi-foot-admin.php:396 +msgid "Oldest:" +msgstr "Più vecchio:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:375 +#: includes/class-swi-foot-admin.php:397 +msgid "Newest:" +msgstr "Più recente:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:384 +#: includes/class-swi-foot-admin.php:406 +msgid "No finished match data stored." +msgstr "Nessun dato di partita terminata memorizzato." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:391 +#: includes/class-swi-foot-admin.php:413 +msgid "Match ID" +msgstr "ID Partita" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:392 +#: includes/class-swi-foot-admin.php:414 +msgid "Saved At" +msgstr "Salvato a" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:393 +#: includes/class-swi-foot-admin.php:415 +msgid "Players" +msgstr "Giocatori" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:394 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:920 +#: includes/class-swi-foot-admin.php:416 +#: includes/class-swi-foot-shortcodes.php:950 +msgid "Bench" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:395 +#: includes/class-swi-foot-admin.php:417 +msgid "Events" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:413 +#: includes/class-swi-foot-admin.php:435 +msgid "Delete" +msgstr "Elimina" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:419 +#: includes/class-swi-foot-admin.php:441 +msgid "Clear All Finished Matches" +msgstr "Cancella tutte le partite terminate" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:426 +#: includes/class-swi-foot-admin.php:448 +msgid "Delete this finished match data?" +msgstr "Eliminare questi dati di partita terminata?" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:443 +#: includes/class-swi-foot-admin.php:465 +msgid "Clear all finished match data?" +msgstr "Cancellare tutti i dati delle partite terminate?" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:243 +#: includes/class-swi-foot-blocks.php:243 +msgid "Standings: No team provided in container context." +msgstr "Classifica: Nessuna squadra fornita nel contesto del contenitore." + +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:251 +#: includes/class-swi-foot-blocks.php:253 +#, php-format +msgid "Error loading standings: %s" +msgstr "Errore nel caricamento della classifica: %s" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:256 +#: includes/class-swi-foot-blocks.php:260 +msgid "No standings data available." +msgstr "Nessun dato di classifica disponibile." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:262 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:764 +#: includes/class-swi-foot-blocks.php:266 +#: includes/class-swi-foot-shortcodes.php:786 +msgid "Current Standings" +msgstr "Classifica attuale" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:266 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:768 +#: includes/class-swi-foot-blocks.php:270 +#: includes/class-swi-foot-shortcodes.php:790 +msgid "Pos" +msgstr "Pos" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:267 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:769 +#: includes/class-swi-foot-blocks.php:271 +#: includes/class-swi-foot-shortcodes.php:791 +msgid "Team" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:268 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:770 +#: includes/class-swi-foot-blocks.php:272 +#: includes/class-swi-foot-shortcodes.php:792 +msgid "P" +msgstr "G" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:269 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:771 +#: includes/class-swi-foot-blocks.php:273 +#: includes/class-swi-foot-shortcodes.php:793 +msgid "W" +msgstr "V" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:270 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:772 +#: includes/class-swi-foot-blocks.php:274 +#: includes/class-swi-foot-shortcodes.php:794 +msgid "D" +msgstr "P" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:271 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:773 +#: includes/class-swi-foot-blocks.php:275 +#: includes/class-swi-foot-shortcodes.php:795 +msgid "L" +msgstr "S" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:272 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:774 +#: includes/class-swi-foot-blocks.php:276 +#: includes/class-swi-foot-shortcodes.php:796 +msgid "GF" +msgstr "RF" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:273 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:775 +#: includes/class-swi-foot-blocks.php:277 +#: includes/class-swi-foot-shortcodes.php:797 +msgid "GA" +msgstr "RS" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:274 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:776 +#: includes/class-swi-foot-blocks.php:278 +#: includes/class-swi-foot-shortcodes.php:798 +msgid "Pts" +msgstr "Pts" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:311 +#: includes/class-swi-foot-blocks.php:316 +msgid "Schedule: No team provided in container context." +msgstr "Calendario: Nessuna squadra fornita nel contesto del contenitore." + +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:319 +#: includes/class-swi-foot-blocks.php:326 +#, php-format +msgid "Error loading schedule: %s" +msgstr "Errore nel caricamento del calendario: %s" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:339 +#: includes/class-swi-foot-blocks.php:373 +msgid "Upcoming Matches" +msgstr "Prossime partite" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:341 +#: includes/class-swi-foot-blocks.php:375 +msgid "No upcoming matches scheduled." +msgstr "Nessuna partita in arrivo programmata." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:432 +#: includes/class-swi-foot-blocks.php:466 +msgid "Match Roster: No match provided in container context." +msgstr "Formazione partita: nessuna partita fornita nel contesto del contenitore." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:468 +#: includes/class-swi-foot-blocks.php:502 +msgid "Match Events: No match provided in container context." +msgstr "Eventi partita: nessuna partita fornita nel contesto del contenitore." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:495 +#: includes/class-swi-foot-blocks.php:530 +msgid "Match Bench: No match provided in container context." +msgstr "Panchina di partita: nessuna partita fornita nel contesto del contenitore." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:522 +#: includes/class-swi-foot-blocks.php:557 +msgid "Match Referees: No match provided in container context." +msgstr "Arbitri della partita: nessuna partita fornita nel contesto del contenitore." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:539 +#: includes/class-swi-foot-blocks.php:574 +msgid "Please configure your API settings and ensure teams are available." +msgstr "Configura le impostazioni API e assicurati che le squadre siano disponibili." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:546 +#: includes/class-swi-foot-blocks.php:581 +#, php-format +msgid "Please select a team to display %s:" +msgstr "Seleziona una squadra per visualizzare %s:" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:548 +#: includes/class-swi-foot-blocks.php:583 +msgid "Select a team..." +msgstr "Seleziona una squadra..." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:62 +#: includes/class-swi-foot-rest.php:427 +#: includes/class-swi-foot-shortcodes.php:62 +msgid "Data not yet available" +msgstr "Dati non ancora disponibili" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:223 +#: includes/class-swi-foot-shortcodes.php:223 +msgid "Match data not available" +msgstr "Dati della partita non disponibili" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:426 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:495 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:826 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:976 +#: includes/class-swi-foot-shortcodes.php:427 +#: includes/class-swi-foot-shortcodes.php:517 +#: includes/class-swi-foot-shortcodes.php:848 +#: includes/class-swi-foot-shortcodes.php:1006 +msgid "Match ID required" +msgstr "ID partita richiesto" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:436 +#: includes/class-swi-foot-shortcodes.php:437 +msgid "No bench data available" +msgstr "Nessun dato di panchina disponibile" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:453 +#: includes/class-swi-foot-shortcodes.php:468 +#: assets/editor-blocks.js:447 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 +msgid "Home Team" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:466 +#: includes/class-swi-foot-shortcodes.php:485 +#: assets/editor-blocks.js:448 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 +msgid "Away Team" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:505 +msgid "No referees data available" +msgstr "Nessun dato arbitro disponibile" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 +msgid "Ja" +msgstr "Sì" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 +msgid "Nein" +msgstr "No" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:752 +#: includes/class-swi-foot-shortcodes.php:774 +msgid "Team ID required" +msgstr "ID squadra richiesto" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:758 +#: includes/class-swi-foot-shortcodes.php:780 +msgid "Standings data not available" +msgstr "Dati classifica non disponibili" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:814 +#: includes/class-swi-foot-shortcodes.php:836 +msgid "Parameter \"side\" must be \"home\" or \"away\"" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:846 +msgid "Roster data not available" +msgstr "Dati formazione non disponibili" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:882 +#: includes/class-swi-foot-shortcodes.php:904 +msgid "No roster display options selected" +msgstr "Nessuna opzione di visualizzazione della formazione selezionata" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:888 +#: includes/class-swi-foot-shortcodes.php:910 +msgid "Team Roster" +msgstr "Formazione squadra" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:892 +#: includes/class-swi-foot-shortcodes.php:914 +msgid "Starting Squad" +msgstr "Squadra di partenza" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:943 +#: includes/class-swi-foot-shortcodes.php:973 +msgid "No roster data to display." +msgstr "Nessun dato di formazione da visualizzare." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:945 +#: includes/class-swi-foot-shortcodes.php:975 +msgid "No roster data available." +msgstr "Nessun dato di formazione disponibile." + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:986 +msgid "Events data not available" +msgstr "Dati eventi non disponibili" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1046 +#: includes/class-swi-foot-shortcodes.php:1076 +msgid "Live match events" +msgstr "Eventi partita in diretta" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1047 +#: includes/class-swi-foot-shortcodes.php:1077 +#: src/editor-blocks.js:237 +msgid "Match Events" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1053 +#: includes/class-swi-foot-shortcodes.php:1083 +msgid "Match minute" +msgstr "Minuto partita" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1114 +#: includes/class-swi-foot-shortcodes.php:1144 +msgid "No events recorded yet." +msgstr "Nessun evento registrato finora." + +#: includes/class-swi-foot-admin.php:48 +msgid "API Response Language" +msgstr "" + +#: includes/class-swi-foot-admin.php:116 +msgid "German" +msgstr "Tedesco" + +#: includes/class-swi-foot-admin.php:117 +msgid "French" +msgstr "Francese" + +#: includes/class-swi-foot-admin.php:118 +msgid "Italian" +msgstr "Italiano" + +#: includes/class-swi-foot-admin.php:120 +msgid "Select the language for API responses (German, French, or Italian)" +msgstr "Seleziona la lingua per le risposte API (tedesco, francese o italiano)" + +#. translators: %1$d is the number of cached match records, %2$d is the cache duration in seconds +#: includes/class-swi-foot-admin.php:377 +#, php-format +msgid "Currently caching %1$d match records with %2$d second cache duration." +msgstr "Attualmente memorizzazione nella cache di %1$d record di partita con durata cache di %2$d secondi." + +#: includes/class-swi-foot-rest.php:417 +msgid "Unknown endpoint" +msgstr "Endpoint sconosciuto" + +#: includes/class-swi-foot-rest.php:429 +#: includes/class-swi-foot-rest.php:432 +#: includes/class-swi-foot-shortcodes.php:66 +#: includes/class-swi-foot-shortcodes.php:527 +msgid "No data available" +msgstr "Nessun dato disponibile" + +#: includes/class-swi-foot-rest.php:434 +msgid "Data available" +msgstr "Dati disponibili" + +#: includes/class-swi-foot-shortcodes.php:929 +msgid "Captain" +msgstr "Capitano" + +#: assets/editor-blocks.js:30 +#: assets/editor-blocks.js:258 +msgid "Swiss Football Team Data" +msgstr "Dati squadra Swiss Football" + +#: assets/editor-blocks.js:31 +msgid "Display team standings or match data with guided selection" +msgstr "Visualizza la classifica della squadra o i dati della partita con selezione guidata" + +#: assets/editor-blocks.js:35 +msgid "football" +msgstr "Calcio" + +#: assets/editor-blocks.js:36 +msgid "soccer" +msgstr "Calcio" + +#: assets/editor-blocks.js:37 +#: assets/editor-blocks.js:339 +msgid "team" +msgstr "Squadra" + +#: assets/editor-blocks.js:38 +msgid "swiss" +msgstr "Svizzero" + +#: assets/editor-blocks.js:133 +msgid "Choose what to display..." +msgstr "Scegli cosa visualizzare..." + +#: assets/editor-blocks.js:134 +msgid "Team Statistics (Standings/Ranking)" +msgstr "Statistiche squadra (Classifica/Ranking)" + +#: assets/editor-blocks.js:135 +#: src/format-shortcode.js:255 +msgid "Match Data" +msgstr "Dati della partita" + +#: assets/editor-blocks.js:140 +msgid "Complete Match Information" +msgstr "Informazioni complete della partita" + +#: assets/editor-blocks.js:141 +msgid "Home Team Name Only" +msgstr "Solo nome della squadra in casa" + +#: assets/editor-blocks.js:142 +msgid "Away Team Name Only" +msgstr "Solo nome della squadra in trasferta" + +#: assets/editor-blocks.js:143 +msgid "Match Date Only" +msgstr "Solo data della partita" + +#: assets/editor-blocks.js:144 +msgid "Match Time Only" +msgstr "Solo ora della partita" + +#: assets/editor-blocks.js:145 +msgid "Venue/Location Only" +msgstr "Solo luogo/posizione" + +#: assets/editor-blocks.js:146 +msgid "Score Only" +msgstr "Solo punteggio" + +#: assets/editor-blocks.js:147 +msgid "Match Status Only" +msgstr "Solo stato della partita" + +#: assets/editor-blocks.js:148 +msgid "League Name Only" +msgstr "Solo nome della lega" + +#: assets/editor-blocks.js:149 +msgid "Round Number Only" +msgstr "Solo numero del turno" + +#: assets/editor-blocks.js:154 +msgid "Team Selection" +msgstr "Selezione squadra" + +#: assets/editor-blocks.js:157 +msgid "1. Select Team" +msgstr "1. Seleziona squadra" + +#: assets/editor-blocks.js:159 +#: assets/editor-blocks.js:423 +#: assets/editor-blocks.js:576 +msgid "Choose a team..." +msgstr "Scegli una squadra..." + +#: assets/editor-blocks.js:176 +msgid "2. What would you like to display?" +msgstr "2. Cosa vorresti visualizzare?" + +#: assets/editor-blocks.js:189 +msgid "Match Settings" +msgstr "" + +#: assets/editor-blocks.js:192 +msgid "3. Select Match" +msgstr "3. Seleziona partita" + +#: assets/editor-blocks.js:194 +#: assets/editor-blocks.js:435 +#: assets/editor-blocks.js:587 +msgid "Choose a match..." +msgstr "Scegli una partita..." + +#: assets/editor-blocks.js:195 +msgid "Current Match (Next upcoming or recent)" +msgstr "Partita attuale (Prossima imminente o recente)" + +#: assets/editor-blocks.js:206 +msgid "4. What match information to display?" +msgstr "4. Quali informazioni sulla partita visualizzare?" + +#: assets/editor-blocks.js:214 +msgid "Advanced Options" +msgstr "Opzioni avanzate" + +#: assets/editor-blocks.js:216 +msgid "Date/Time Format" +msgstr "Formato Data/Ora" + +#: assets/editor-blocks.js:219 +#: assets/editor-blocks.js:225 +msgid "Default (WordPress setting)" +msgstr "Predefinito (impostazione WordPress)" + +#: assets/editor-blocks.js:234 +msgid "Score Separator" +msgstr "Separatore punteggio" + +#: assets/editor-blocks.js:261 +msgid "1. Please select a team to get started" +msgstr "1. Seleziona una squadra per iniziare" + +#: assets/editor-blocks.js:265 +msgid "2. Please choose what you want to display" +msgstr "2. Scegli cosa vuoi visualizzare" + +#: assets/editor-blocks.js:269 +msgid "Will display team standings/ranking" +msgstr "Visualizzerà la classifica/ranking della squadra" + +#: assets/editor-blocks.js:273 +msgid "3. Please select a match" +msgstr "3. Seleziona una partita" + +#: assets/editor-blocks.js:278 +msgid "Ready to display match data" +msgstr "Pronto per visualizzare i dati della partita" + +#: assets/editor-blocks.js:281 +msgid "Generated shortcode:" +msgstr "Shortcode generato:" + +#: assets/editor-blocks.js:331 +#: src/editor-blocks.js:137 +msgid "Swiss Football Match Roster" +msgstr "Formazione partita Swiss Football" + +#: assets/editor-blocks.js:332 +msgid "Display match roster for home or away team, with optional bench players" +msgstr "Visualizza la formazione della partita per la squadra in casa o in trasferta, con giocatori di panchina opzionali" + +#: assets/editor-blocks.js:336 +msgid "roster" +msgstr "Formazione" + +#: assets/editor-blocks.js:337 +msgid "players" +msgstr "Giocatori" + +#: assets/editor-blocks.js:338 +msgid "lineup" +msgstr "Formazione" + +#: assets/editor-blocks.js:417 +#: assets/editor-blocks.js:572 +msgid "Match Selection" +msgstr "Selezione partita" + +#: assets/editor-blocks.js:421 +#: assets/editor-blocks.js:574 +msgid "Select Team" +msgstr "Seleziona squadra" + +#: assets/editor-blocks.js:433 +#: assets/editor-blocks.js:585 +msgid "Select Match" +msgstr "Seleziona partita" + +#: assets/editor-blocks.js:436 +#: assets/editor-blocks.js:588 +msgid "Current Match" +msgstr "Partita attuale" + +#: assets/editor-blocks.js:444 +msgid "Select Side" +msgstr "Seleziona lato" + +#: assets/editor-blocks.js:455 +msgid "Include Bench Players" +msgstr "Includi giocatori di panchina" + +#: assets/editor-blocks.js:456 +msgid "When enabled, bench players will also be displayed" +msgstr "Quando abilitato, verranno visualizzati anche i giocatori di panchina" + +#: assets/editor-blocks.js:473 +#: src/editor-blocks.js:177 +msgid "Match Roster" +msgstr "Formazione partita" + +#: assets/editor-blocks.js:476 +msgid "Please select team, match, side, and bench option" +msgstr "Seleziona squadra, partita, lato e opzione panchina" + +#: assets/editor-blocks.js:508 +#: src/editor-blocks.js:197 +msgid "Swiss Football Match Events" +msgstr "Eventi partita Swiss Football" + +#: assets/editor-blocks.js:509 +msgid "Display live match events with auto-refresh" +msgstr "Visualizza eventi partita in diretta con aggiornamento automatico" + +#: assets/editor-blocks.js:513 +msgid "events" +msgstr "Eventi" + +#: assets/editor-blocks.js:514 +msgid "live" +msgstr "In diretta" + +#: assets/editor-blocks.js:515 +msgid "timeline" +msgstr "Cronologia" + +#: assets/editor-blocks.js:516 +msgid "match" +msgstr "Partita" + +#: assets/editor-blocks.js:595 +msgid "Auto-Refresh Settings" +msgstr "Impostazioni aggiornamento automatico" + +#: assets/editor-blocks.js:597 +#: src/editor-blocks.js:214 +msgid "Refresh Interval (seconds)" +msgstr "Intervallo di aggiornamento (secondi)" + +#: assets/editor-blocks.js:616 +msgid "Live Match Events" +msgstr "Eventi partita in diretta" + +#: assets/editor-blocks.js:618 +msgid "Please select team and match" +msgstr "Seleziona squadra e partita" + +#: assets/editor-blocks.js:620 +msgid "Will display live match events" +msgstr "Visualizzerà gli eventi della partita in diretta" + +#: assets/editor-blocks.js:622 +msgid "Auto-refresh every" +msgstr "Aggiorna automaticamente ogni" + +#: assets/editor-blocks.js:622 +msgid "seconds" +msgstr "Secondi" + +#: src/editor-blocks.js:68 +msgid "Swiss Football Standings" +msgstr "Classifica Swiss Football" + +#: src/editor-blocks.js:76 +#: src/editor-blocks.js:311 +msgid "Settings" +msgstr "Impostazioni" + +#: src/editor-blocks.js:77 +#: src/editor-blocks.js:109 +msgid "Team is inherited from the container context." +msgstr "La squadra viene ereditata dal contesto del contenitore." + +#: src/editor-blocks.js:81 +msgid "Standings" +msgstr "Classifica" + +#: src/editor-blocks.js:82 +msgid "League standings inherited from team context. ✓ Data will render on the front-end." +msgstr "Classifica della lega ereditata dal contesto della squadra. ✓ I dati verranno visualizzati sul front-end." + +#: src/editor-blocks.js:94 +msgid "Swiss Football Schedule" +msgstr "Calendario Swiss Football" + +#: src/editor-blocks.js:108 +msgid "Schedule settings" +msgstr "Impostazioni calendario" + +#: src/editor-blocks.js:110 +msgid "Limit" +msgstr "Limite" + +#: src/editor-blocks.js:124 +msgid "Schedule" +msgstr "" + +#: src/editor-blocks.js:125 +msgid "Team and match schedule inherited from context. ✓ Data will render on the front-end." +msgstr "Calendario della squadra e della partita ereditato dal contesto. ✓ I dati verranno visualizzati sul front-end." + +#: src/editor-blocks.js:152 +#: src/editor-blocks.js:211 +#: src/editor-blocks.js:272 +msgid "Display Options" +msgstr "Opzioni visualizzazione" + +#: src/editor-blocks.js:153 +#: src/editor-blocks.js:212 +msgid "Match and team are inherited from the container context." +msgstr "La partita e la squadra vengono ereditate dal contesto del contenitore." + +#: src/editor-blocks.js:155 +#: src/editor-blocks.js:275 +msgid "Team Side" +msgstr "Lato squadra" + +#: src/editor-blocks.js:163 +msgid "Show Starting Squad" +msgstr "" + +#: src/editor-blocks.js:169 +msgid "Show Bench" +msgstr "" + +#: src/editor-blocks.js:178 +msgid "Team and match are inherited from the container context. ✓ Data will render on the front-end." +msgstr "La squadra e la partita vengono ereditate dal contesto del contenitore. ✓ I dati verranno visualizzati sul front-end." + +#: src/editor-blocks.js:222 +msgid "Event Order" +msgstr "Ordine degli eventi" + +#: src/editor-blocks.js:226 +msgid "Dynamic (Newest first while live, chronological after)" +msgstr "Dinamico (Più recente per primo durante la trasmissione in diretta, cronologico dopo)" + +#: src/editor-blocks.js:227 +msgid "Newest First" +msgstr "Più recente per primo" + +#: src/editor-blocks.js:228 +msgid "Oldest First" +msgstr "Più vecchio per primo" + +#: src/editor-blocks.js:230 +msgid "Dynamic: newest events at top while match is ongoing, chronological (oldest first) after match ends" +msgstr "Dinamico: ultimi eventi in alto mentre la partita è in corso, cronologico (più vecchio per primo) dopo la fine della partita" + +#: src/editor-blocks.js:238 +msgid "Live match events inherited from context. ✓ Will update during match." +msgstr "Eventi partita in diretta ereditati dal contesto. ✓ Verranno aggiornati durante la partita." + +#: src/editor-blocks.js:258 +msgid "Swiss Football Match Bench" +msgstr "Panchina partita Swiss Football" + +#: src/editor-blocks.js:273 +#: src/editor-blocks.js:312 +msgid "Match is inherited from the container context." +msgstr "La partita viene ereditata dal contesto del contenitore." + +#: src/editor-blocks.js:285 +msgid "Match Bench" +msgstr "Panchina partita" + +#: src/editor-blocks.js:286 +msgid "Team bench and substitutes inherited from context. ✓ Data will render on the front-end." +msgstr "Panchina della squadra e sostituti ereditati dal contesto. ✓ I dati verranno visualizzati sul front-end." + +#: src/editor-blocks.js:302 +msgid "Swiss Football Match Referees" +msgstr "Arbitri partita Swiss Football" + +#: src/editor-blocks.js:316 +msgid "Match Referees" +msgstr "Arbitri partita" + +#: src/editor-blocks.js:317 +msgid "Match officials and referees inherited from context. ✓ Data will render on the front-end." +msgstr "Arbitri e arbitri della partita ereditati dal contesto. ✓ I dati verranno visualizzati sul front-end." + +#: src/format-shortcode.js:31 +msgid "— Select data point…" +msgstr "— Seleziona un punto di dati…" + +#: src/format-shortcode.js:32 +msgid "Match-Typ" +msgstr "Tipo di partita" + +#: src/format-shortcode.js:33 +msgid "Liga" +msgstr "Lega" + +#: src/format-shortcode.js:34 +msgid "Gruppe" +msgstr "Gruppo" + +#: src/format-shortcode.js:35 +msgid "Runde" +msgstr "Turno" + +#: src/format-shortcode.js:36 +msgid "Spielfeld" +msgstr "Campo" + +#: src/format-shortcode.js:37 +msgid "Heimteam" +msgstr "Squadra in casa" + +#: src/format-shortcode.js:38 +msgid "Gastteam" +msgstr "Squadra in trasferta" + +#: src/format-shortcode.js:39 +msgid "Tore Heim" +msgstr "Gol in casa" + +#: src/format-shortcode.js:40 +msgid "Tore Gast" +msgstr "Gol in trasferta" + +#: src/format-shortcode.js:41 +msgid "Tore Halbzeit Heim" +msgstr "Gol primo tempo in casa" + +#: src/format-shortcode.js:42 +msgid "Tore Halbzeit Gast" +msgstr "Gol primo tempo in trasferta" + +#: src/format-shortcode.js:43 +msgid "Spieltag" +msgstr "Giorno della partita" + +#: src/format-shortcode.js:44 +msgid "Spielzeit" +msgstr "Orario della partita" + +#: src/format-shortcode.js:45 +msgid "Spielstatus" +msgstr "Stato della partita" + +#: src/format-shortcode.js:46 +msgid "Spiel pausiert" +msgstr "Partita in pausa" + +#: src/format-shortcode.js:47 +msgid "Spiel beendet" +msgstr "Partita terminata" + +#: src/format-shortcode.js:52 +msgid "— Select shortcode…" +msgstr "— Seleziona un shortcode…" + +#: src/format-shortcode.js:53 +msgid "Heimteam Logo" +msgstr "Logo squadra in casa" + +#: src/format-shortcode.js:54 +msgid "Gastteam Logo" +msgstr "Logo squadra in trasferta" + +#: src/format-shortcode.js:55 +msgid "Heimteam Logo (URL)" +msgstr "Logo squadra in casa (URL)" + +#: src/format-shortcode.js:56 +msgid "Gastteam Logo (URL)" +msgstr "Logo squadra in trasferta (URL)" + +#: src/format-shortcode.js:229 +#: src/format-shortcode.js:242 +#: src/format-shortcode.js:360 +#: src/format-shortcode.js:394 +msgid "Insert Match Data" +msgstr "Inserisci dati partita" + +#: src/format-shortcode.js:234 +msgid "No match data available on this page. Please add match context first." +msgstr "Nessun dato di partita disponibile su questa pagina. Aggiungi prima un contesto di partita." + +#: src/format-shortcode.js:265 +msgid "Shortcodes" +msgstr "" + +#: src/format-shortcode.js:278 +msgid "Data Point" +msgstr "Punto dati" + +#: src/format-shortcode.js:282 +msgid "Select which match data to display" +msgstr "Seleziona i dati della partita da visualizzare" + +#: src/format-shortcode.js:291 +msgid "Preview:" +msgstr "Anteprima:" + +#: src/format-shortcode.js:299 +msgid "(no value)" +msgstr "(nessun valore)" + +#: src/format-shortcode.js:309 +msgid "Insert Data" +msgstr "Inserisci dati" + +#: src/format-shortcode.js:322 +msgid "Shortcode" +msgstr "Shortcode" + +#: src/format-shortcode.js:326 +msgid "Select a shortcode to insert (logos, etc.)" +msgstr "Seleziona uno shortcode da inserire (loghi, ecc.)" + +#: src/format-shortcode.js:335 +msgid "Shortcode:" +msgstr "Shortcode:" + +#: src/format-shortcode.js:345 +msgid "Insert Shortcode" +msgstr "Inserisci shortcode" + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block title" +msgid "Swiss Football Context (container)" +msgstr "Contesto Swiss Football (contenitore)" + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block description" +msgid "Provides a team/season/match context to child blocks. Children will inherit these settings unless they override them." +msgstr "Fornisce un contesto di team/stagione/partita ai blocchi figlio. I blocchi figlio erediteranno queste impostazioni a meno che non le escludano." + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block title" +msgid "Swiss Football Match Bench" +msgstr "" + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block description" +msgid "Display team staff and substitutes for a match" +msgstr "Visualizza lo staff della squadra e i sostituti per una partita" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block title" +msgid "Swiss Football Match Events" +msgstr "Eventi partita Swiss Football" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block description" +msgid "Live match events with optional auto-refresh." +msgstr "Eventi della partita in diretta con aggiornamento automatico opzionale." + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block title" +msgid "Swiss Football Match Referees" +msgstr "" + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block description" +msgid "Display match officials and referees" +msgstr "Visualizza arbitri e arbitri della partita" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block title" +msgid "Swiss Football Match Roster" +msgstr "Formazione partita Swiss Football" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block description" +msgid "Display match roster for a selected match and side." +msgstr "Visualizza la formazione della partita per una partita e un lato selezionati." + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block title" +msgid "Swiss Football Schedule" +msgstr "" + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block description" +msgid "Display upcoming matches for a team." +msgstr "Visualizza le partite in arrivo per una squadra." + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block title" +msgid "SWI Football Shortcode Inserter" +msgstr "SWI Football Shortcode Inserter" + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block description" +msgid "Insert shortcode-based match or team displays." +msgstr "Inserisci visualizzazioni di partita o di squadra basate su shortcode." + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block title" +msgid "Swiss Football Standings" +msgstr "" + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block description" +msgid "Display current standings for a team." +msgstr "Visualizza la classifica attuale per una squadra." + +#: src/editor-blocks.js:112 +msgid "Match Filter" +msgstr "Filtro partita" + +#: src/editor-blocks.js:115 +msgid "All Matches" +msgstr "Tutte le partite" + +#: src/editor-blocks.js:116 +msgid "Home Matches Only" +msgstr "Solo partite in casa" + +#: src/editor-blocks.js:117 +msgid "Away Matches Only" +msgstr "Solo partite in trasferta" diff --git a/languages/swi_foot_matchdata.pot b/languages/swi_foot_matchdata.pot index 0a277d3..9333298 100644 --- a/languages/swi_foot_matchdata.pot +++ b/languages/swi_foot_matchdata.pot @@ -1,539 +1,1060 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy +# Copyright (C) 2026 David Reindl (assisted by Claude AI) +# This file is distributed under the same license as the Swiss Football Matchdata plugin. msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-03-18 14:50+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Project-Id-Version: Swiss Football Matchdata 1.0.0\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/swiss-football-matchdata\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2026-03-27T11:49:07+00:00\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"X-Generator: WP-CLI 2.12.0\n" +"X-Domain: swi_foot_matchdata\n" -#: includes/class-swi-foot-admin.php:18 includes/class-swi-foot-admin.php:249 +#. Plugin Name of the plugin +#: swiss-football-matchdata.php +msgid "Swiss Football Matchdata" +msgstr "" + +#. Description of the plugin +#: swiss-football-matchdata.php +msgid "WordPress plugin to consume Swiss Football Association API for team standings, schedules, and match details with shortcode support" +msgstr "" + +#. Author of the plugin +#: swiss-football-matchdata.php +msgid "David Reindl (assisted by Claude AI)" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:18 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:249 +#: includes/class-swi-foot-admin.php:18 +#: includes/class-swi-foot-admin.php:262 msgid "Swiss Football Matchdata Settings" msgstr "" +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:19 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:31 #: includes/class-swi-foot-admin.php:19 +#: includes/class-swi-foot-blocks.php:31 msgid "Swiss Football" msgstr "" -#: includes/class-swi-foot-admin.php:37 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:37 +#: includes/class-swi-foot-admin.php:38 msgid "API Configuration" msgstr "" -#: includes/class-swi-foot-admin.php:42 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:42 +#: includes/class-swi-foot-admin.php:43 msgid "API Base URL" msgstr "" -#: includes/class-swi-foot-admin.php:43 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:43 +#: includes/class-swi-foot-admin.php:44 msgid "API Username (Application Key)" msgstr "" -#: includes/class-swi-foot-admin.php:44 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:44 +#: includes/class-swi-foot-admin.php:45 msgid "API Password (Application Pass)" msgstr "" -#: includes/class-swi-foot-admin.php:45 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:45 +#: includes/class-swi-foot-admin.php:46 msgid "Verein ID (Club ID)" msgstr "" -#: includes/class-swi-foot-admin.php:46 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:46 +#: includes/class-swi-foot-admin.php:47 msgid "Season ID" msgstr "" -#: includes/class-swi-foot-admin.php:50 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:50 +#: includes/class-swi-foot-admin.php:52 msgid "Cache Settings" msgstr "" -#: includes/class-swi-foot-admin.php:55 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:55 +#: includes/class-swi-foot-admin.php:57 msgid "Match Data Cache Duration (seconds)" msgstr "" -#: includes/class-swi-foot-admin.php:60 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:60 +#: includes/class-swi-foot-admin.php:62 msgid "Configure your Swiss Football API credentials here." msgstr "" -#: includes/class-swi-foot-admin.php:65 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:65 +#: includes/class-swi-foot-admin.php:67 msgid "Configure caching settings for match data." msgstr "" -#: includes/class-swi-foot-admin.php:72 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:72 +#: includes/class-swi-foot-admin.php:74 msgid "The base URL for the Swiss Football API" msgstr "" -#: includes/class-swi-foot-admin.php:79 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:79 +#: includes/class-swi-foot-admin.php:81 msgid "Your API application key" msgstr "" -#: includes/class-swi-foot-admin.php:86 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:86 +#: includes/class-swi-foot-admin.php:88 msgid "Your API application password" msgstr "" -#: includes/class-swi-foot-admin.php:93 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:93 +#: includes/class-swi-foot-admin.php:95 msgid "Enter your club's Verein ID (Club ID)" msgstr "" -#: includes/class-swi-foot-admin.php:100 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:100 +#: includes/class-swi-foot-admin.php:102 msgid "Current season ID (usually the year)" msgstr "" -#: includes/class-swi-foot-admin.php:107 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:107 +#: includes/class-swi-foot-admin.php:109 msgid "How long to cache match data in seconds (10-300)" msgstr "" -#: includes/class-swi-foot-admin.php:175 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:175 +#: includes/class-swi-foot-admin.php:188 msgid "Swiss Football Shortcodes" msgstr "" -#: includes/class-swi-foot-admin.php:187 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:187 +#: includes/class-swi-foot-admin.php:200 msgid "Available Shortcodes:" msgstr "" -#: includes/class-swi-foot-admin.php:190 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:190 +#: includes/class-swi-foot-admin.php:203 msgid "Full Match Display:" msgstr "" -#: includes/class-swi-foot-admin.php:196 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:196 +#: includes/class-swi-foot-admin.php:209 msgid "Individual Match Elements:" msgstr "" -#: includes/class-swi-foot-admin.php:209 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:209 +#: includes/class-swi-foot-admin.php:222 msgid "Parameters:" msgstr "" -#: includes/class-swi-foot-admin.php:219 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:219 +#: includes/class-swi-foot-admin.php:232 msgid "Click any shortcode above to copy it to clipboard" msgstr "" -#: includes/class-swi-foot-admin.php:227 includes/class-swi-foot-admin.php:237 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:227 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:237 +#: includes/class-swi-foot-admin.php:240 +#: includes/class-swi-foot-admin.php:250 msgid "Shortcode copied to clipboard!" msgstr "" -#: includes/class-swi-foot-admin.php:260 -msgid "Connection Test" +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:258 +#: includes/class-swi-foot-admin.php:271 +msgid "Save and Test" msgstr "" -#: includes/class-swi-foot-admin.php:263 -msgid "Test API Connection" +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:261 +#: includes/class-swi-foot-admin.php:274 +msgid "Save without Test" msgstr "" -#: includes/class-swi-foot-admin.php:270 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:268 +#: includes/class-swi-foot-admin.php:281 msgid "Team Management" msgstr "" -#: includes/class-swi-foot-admin.php:273 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:271 +#: includes/class-swi-foot-admin.php:284 msgid "Refresh Teams List" msgstr "" -#: includes/class-swi-foot-admin.php:284 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:282 +#: includes/class-swi-foot-admin.php:295 msgid "Cache Management" msgstr "" -#: includes/class-swi-foot-admin.php:287 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:285 +#: includes/class-swi-foot-admin.php:298 msgid "Clear Match Data Cache" msgstr "" -#: includes/class-swi-foot-admin.php:295 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:293 +#: includes/class-swi-foot-admin.php:306 msgid "Finished Matches Data" msgstr "" -#: includes/class-swi-foot-admin.php:300 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:298 +#: includes/class-swi-foot-admin.php:311 msgid "Quick Shortcode Reference" msgstr "" -#: includes/class-swi-foot-admin.php:303 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:301 +#: includes/class-swi-foot-admin.php:314 msgid "Common Examples:" msgstr "" -#: includes/class-swi-foot-admin.php:304 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:302 +#: includes/class-swi-foot-admin.php:315 msgid "Display full match info:" msgstr "" -#: includes/class-swi-foot-admin.php:308 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:306 +#: includes/class-swi-foot-admin.php:319 msgid "Show next match for a team:" msgstr "" -#: includes/class-swi-foot-admin.php:312 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:310 +#: includes/class-swi-foot-admin.php:323 msgid "Individual elements in text:" msgstr "" -#: includes/class-swi-foot-admin.php:313 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 msgid "The match between" msgstr "" -#: includes/class-swi-foot-admin.php:313 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 msgid "and" msgstr "" -#: includes/class-swi-foot-admin.php:313 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:311 +#: includes/class-swi-foot-admin.php:324 msgid "is on" msgstr "" -#: includes/class-swi-foot-admin.php:328 +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:326 +#: includes/class-swi-foot-admin.php:341 #, php-format msgid "Error loading teams: %s" msgstr "" -#: includes/class-swi-foot-admin.php:335 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:333 +#: includes/class-swi-foot-admin.php:350 msgid "No teams found. Please check your API configuration." msgstr "" -#: includes/class-swi-foot-admin.php:340 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:338 +#: includes/class-swi-foot-admin.php:355 msgid "Available Teams:" msgstr "" -#: includes/class-swi-foot-admin.php:360 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:358 #, php-format msgid "Currently caching %d match records with %d second cache duration." msgstr "" -#: includes/class-swi-foot-admin.php:375 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:373 +#: includes/class-swi-foot-admin.php:395 msgid "Cache Range:" msgstr "" -#: includes/class-swi-foot-admin.php:376 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:374 +#: includes/class-swi-foot-admin.php:396 msgid "Oldest:" msgstr "" -#: includes/class-swi-foot-admin.php:377 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:375 +#: includes/class-swi-foot-admin.php:397 msgid "Newest:" msgstr "" -#: includes/class-swi-foot-admin.php:386 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:384 +#: includes/class-swi-foot-admin.php:406 msgid "No finished match data stored." msgstr "" -#: includes/class-swi-foot-admin.php:393 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:391 +#: includes/class-swi-foot-admin.php:413 msgid "Match ID" msgstr "" -#: includes/class-swi-foot-admin.php:394 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:392 +#: includes/class-swi-foot-admin.php:414 msgid "Saved At" msgstr "" -#: includes/class-swi-foot-admin.php:395 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:393 +#: includes/class-swi-foot-admin.php:415 msgid "Players" msgstr "" -#: includes/class-swi-foot-admin.php:396 -#: includes/class-swi-foot-shortcodes.php:768 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:394 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:920 +#: includes/class-swi-foot-admin.php:416 +#: includes/class-swi-foot-shortcodes.php:950 msgid "Bench" msgstr "" -#: includes/class-swi-foot-admin.php:397 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:395 +#: includes/class-swi-foot-admin.php:417 msgid "Events" msgstr "" -#: includes/class-swi-foot-admin.php:415 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:413 +#: includes/class-swi-foot-admin.php:435 msgid "Delete" msgstr "" -#: includes/class-swi-foot-admin.php:421 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:419 +#: includes/class-swi-foot-admin.php:441 msgid "Clear All Finished Matches" msgstr "" -#: includes/class-swi-foot-admin.php:428 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:426 +#: includes/class-swi-foot-admin.php:448 msgid "Delete this finished match data?" msgstr "" -#: includes/class-swi-foot-admin.php:445 +#: dist/swiss-football-matchdata/includes/class-swi-foot-admin.php:443 +#: includes/class-swi-foot-admin.php:465 msgid "Clear all finished match data?" msgstr "" -#: includes/class-swi-foot-blocks.php:218 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:243 +#: includes/class-swi-foot-blocks.php:243 msgid "Standings: No team provided in container context." msgstr "" -#: includes/class-swi-foot-blocks.php:226 +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:251 +#: includes/class-swi-foot-blocks.php:253 #, php-format msgid "Error loading standings: %s" msgstr "" -#: includes/class-swi-foot-blocks.php:231 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:256 +#: includes/class-swi-foot-blocks.php:260 msgid "No standings data available." msgstr "" -#: includes/class-swi-foot-blocks.php:237 -#: includes/class-swi-foot-shortcodes.php:631 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:262 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:764 +#: includes/class-swi-foot-blocks.php:266 +#: includes/class-swi-foot-shortcodes.php:786 msgid "Current Standings" msgstr "" -#: includes/class-swi-foot-blocks.php:241 -#: includes/class-swi-foot-shortcodes.php:635 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:266 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:768 +#: includes/class-swi-foot-blocks.php:270 +#: includes/class-swi-foot-shortcodes.php:790 msgid "Pos" msgstr "" -#: includes/class-swi-foot-blocks.php:242 -#: includes/class-swi-foot-shortcodes.php:636 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:267 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:769 +#: includes/class-swi-foot-blocks.php:271 +#: includes/class-swi-foot-shortcodes.php:791 msgid "Team" msgstr "" -#: includes/class-swi-foot-blocks.php:243 -#: includes/class-swi-foot-shortcodes.php:637 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:268 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:770 +#: includes/class-swi-foot-blocks.php:272 +#: includes/class-swi-foot-shortcodes.php:792 msgid "P" msgstr "" -#: includes/class-swi-foot-blocks.php:244 -#: includes/class-swi-foot-shortcodes.php:638 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:269 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:771 +#: includes/class-swi-foot-blocks.php:273 +#: includes/class-swi-foot-shortcodes.php:793 msgid "W" msgstr "" -#: includes/class-swi-foot-blocks.php:245 -#: includes/class-swi-foot-shortcodes.php:639 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:270 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:772 +#: includes/class-swi-foot-blocks.php:274 +#: includes/class-swi-foot-shortcodes.php:794 msgid "D" msgstr "" -#: includes/class-swi-foot-blocks.php:246 -#: includes/class-swi-foot-shortcodes.php:640 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:271 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:773 +#: includes/class-swi-foot-blocks.php:275 +#: includes/class-swi-foot-shortcodes.php:795 msgid "L" msgstr "" -#: includes/class-swi-foot-blocks.php:247 -#: includes/class-swi-foot-shortcodes.php:641 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:272 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:774 +#: includes/class-swi-foot-blocks.php:276 +#: includes/class-swi-foot-shortcodes.php:796 msgid "GF" msgstr "" -#: includes/class-swi-foot-blocks.php:248 -#: includes/class-swi-foot-shortcodes.php:642 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:273 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:775 +#: includes/class-swi-foot-blocks.php:277 +#: includes/class-swi-foot-shortcodes.php:797 msgid "GA" msgstr "" -#: includes/class-swi-foot-blocks.php:249 -#: includes/class-swi-foot-shortcodes.php:643 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:274 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:776 +#: includes/class-swi-foot-blocks.php:278 +#: includes/class-swi-foot-shortcodes.php:798 msgid "Pts" msgstr "" -#: includes/class-swi-foot-blocks.php:286 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:311 +#: includes/class-swi-foot-blocks.php:316 msgid "Schedule: No team provided in container context." msgstr "" -#: includes/class-swi-foot-blocks.php:294 +#. translators: %s is the error message from the API +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:319 +#: includes/class-swi-foot-blocks.php:326 #, php-format msgid "Error loading schedule: %s" msgstr "" -#: includes/class-swi-foot-blocks.php:314 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:339 +#: includes/class-swi-foot-blocks.php:373 msgid "Upcoming Matches" msgstr "" -#: includes/class-swi-foot-blocks.php:316 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:341 +#: includes/class-swi-foot-blocks.php:375 msgid "No upcoming matches scheduled." msgstr "" -#: includes/class-swi-foot-blocks.php:406 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:432 +#: includes/class-swi-foot-blocks.php:466 msgid "Match Roster: No match provided in container context." msgstr "" -#: includes/class-swi-foot-blocks.php:438 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:468 +#: includes/class-swi-foot-blocks.php:502 msgid "Match Events: No match provided in container context." msgstr "" -#: includes/class-swi-foot-blocks.php:455 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:495 +#: includes/class-swi-foot-blocks.php:530 +msgid "Match Bench: No match provided in container context." +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:522 +#: includes/class-swi-foot-blocks.php:557 +msgid "Match Referees: No match provided in container context." +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:539 +#: includes/class-swi-foot-blocks.php:574 msgid "Please configure your API settings and ensure teams are available." msgstr "" -#: includes/class-swi-foot-blocks.php:462 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:546 +#: includes/class-swi-foot-blocks.php:581 #, php-format msgid "Please select a team to display %s:" msgstr "" -#: includes/class-swi-foot-blocks.php:464 +#: dist/swiss-football-matchdata/includes/class-swi-foot-blocks.php:548 +#: includes/class-swi-foot-blocks.php:583 msgid "Select a team..." msgstr "" -#: includes/class-swi-foot-shortcodes.php:201 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:62 +#: includes/class-swi-foot-rest.php:427 +#: includes/class-swi-foot-shortcodes.php:62 +msgid "Data not yet available" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:223 +#: includes/class-swi-foot-shortcodes.php:223 msgid "Match data not available" msgstr "" -#: includes/class-swi-foot-shortcodes.php:440 src/format-shortcode.js:201 -msgid "Ja" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:440 src/format-shortcode.js:201 -msgid "Nein" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:619 -msgid "Team ID required" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:625 -msgid "Standings data not available" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:679 -msgid "Parameter \"side\" must be \"home\" or \"away\"" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:691 -#: includes/class-swi-foot-shortcodes.php:812 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:426 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:495 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:826 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:976 +#: includes/class-swi-foot-shortcodes.php:427 +#: includes/class-swi-foot-shortcodes.php:517 +#: includes/class-swi-foot-shortcodes.php:848 +#: includes/class-swi-foot-shortcodes.php:1006 msgid "Match ID required" msgstr "" -#: includes/class-swi-foot-shortcodes.php:703 -msgid "Roster data not available" +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:436 +#: includes/class-swi-foot-shortcodes.php:437 +msgid "No bench data available" msgstr "" -#: includes/class-swi-foot-shortcodes.php:743 -msgid "Team Roster" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:764 -msgid "No roster data available." -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:822 -msgid "Events data not available" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:882 -msgid "Live match events" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:883 -msgid "Match Events" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:889 -msgid "Match minute" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:950 -msgid "No events recorded yet." -msgstr "" - -#: src/editor-blocks.js:59 -msgid "Settings" -msgstr "" - -#: src/editor-blocks.js:60 src/editor-blocks.js:80 -msgid "Team is inherited from the container context." -msgstr "" - -#: src/editor-blocks.js:63 -msgid "Standings will render on the front-end." -msgstr "" - -#: src/editor-blocks.js:79 -msgid "Schedule settings" -msgstr "" - -#: src/editor-blocks.js:81 -msgid "Limit" -msgstr "" - -#: src/editor-blocks.js:84 -msgid "Upcoming matches will render on the front-end." -msgstr "" - -#: src/editor-blocks.js:99 -msgid "Swiss Football Team Data" -msgstr "" - -#: src/editor-blocks.js:126 -msgid "Team Selection" -msgstr "" - -#: src/editor-blocks.js:128 -msgid "1. Select Team" -msgstr "" - -#: src/editor-blocks.js:129 -msgid "Choose a team..." -msgstr "" - -#: src/editor-blocks.js:133 -msgid "2. What to display" -msgstr "" - -#: src/editor-blocks.js:133 -msgid "Choose..." -msgstr "" - -#: src/editor-blocks.js:133 -msgid "Standings" -msgstr "" - -#: src/editor-blocks.js:133 -msgid "Match" -msgstr "" - -#: src/editor-blocks.js:138 -msgid "Team data shortcode generator" -msgstr "" - -#: src/editor-blocks.js:161 -msgid "Swiss Football Match Roster" -msgstr "" - -#: src/editor-blocks.js:168 src/editor-blocks.js:206 -msgid "Display Options" -msgstr "" - -#: src/editor-blocks.js:169 src/editor-blocks.js:207 -msgid "Match and team are inherited from the container context." -msgstr "" - -#: src/editor-blocks.js:171 -msgid "Team Side" -msgstr "" - -#: src/editor-blocks.js:173 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:453 +#: includes/class-swi-foot-shortcodes.php:468 +#: assets/editor-blocks.js:447 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 msgid "Home Team" msgstr "" -#: src/editor-blocks.js:173 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:466 +#: includes/class-swi-foot-shortcodes.php:485 +#: assets/editor-blocks.js:448 +#: src/editor-blocks.js:157 +#: src/editor-blocks.js:277 msgid "Away Team" msgstr "" -#: src/editor-blocks.js:177 +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:505 +msgid "No referees data available" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 +msgid "Ja" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:573 +#: includes/class-swi-foot-shortcodes.php:595 +#: src/format-shortcode.js:201 +msgid "Nein" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:752 +#: includes/class-swi-foot-shortcodes.php:774 +msgid "Team ID required" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:758 +#: includes/class-swi-foot-shortcodes.php:780 +msgid "Standings data not available" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:814 +#: includes/class-swi-foot-shortcodes.php:836 +msgid "Parameter \"side\" must be \"home\" or \"away\"" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:846 +msgid "Roster data not available" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:882 +#: includes/class-swi-foot-shortcodes.php:904 +msgid "No roster display options selected" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:888 +#: includes/class-swi-foot-shortcodes.php:910 +msgid "Team Roster" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:892 +#: includes/class-swi-foot-shortcodes.php:914 +msgid "Starting Squad" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:943 +#: includes/class-swi-foot-shortcodes.php:973 +msgid "No roster data to display." +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:945 +#: includes/class-swi-foot-shortcodes.php:975 +msgid "No roster data available." +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:986 +msgid "Events data not available" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1046 +#: includes/class-swi-foot-shortcodes.php:1076 +msgid "Live match events" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1047 +#: includes/class-swi-foot-shortcodes.php:1077 +#: src/editor-blocks.js:237 +msgid "Match Events" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1053 +#: includes/class-swi-foot-shortcodes.php:1083 +msgid "Match minute" +msgstr "" + +#: dist/swiss-football-matchdata/includes/class-swi-foot-shortcodes.php:1114 +#: includes/class-swi-foot-shortcodes.php:1144 +msgid "No events recorded yet." +msgstr "" + +#: includes/class-swi-foot-admin.php:48 +msgid "API Response Language" +msgstr "" + +#: includes/class-swi-foot-admin.php:116 +msgid "German" +msgstr "" + +#: includes/class-swi-foot-admin.php:117 +msgid "French" +msgstr "" + +#: includes/class-swi-foot-admin.php:118 +msgid "Italian" +msgstr "" + +#: includes/class-swi-foot-admin.php:120 +msgid "Select the language for API responses (German, French, or Italian)" +msgstr "" + +#. translators: %1$d is the number of cached match records, %2$d is the cache duration in seconds +#: includes/class-swi-foot-admin.php:377 +#, php-format +msgid "Currently caching %1$d match records with %2$d second cache duration." +msgstr "" + +#: includes/class-swi-foot-rest.php:417 +msgid "Unknown endpoint" +msgstr "" + +#: includes/class-swi-foot-rest.php:429 +#: includes/class-swi-foot-rest.php:432 +#: includes/class-swi-foot-shortcodes.php:66 +#: includes/class-swi-foot-shortcodes.php:527 +msgid "No data available" +msgstr "" + +#: includes/class-swi-foot-rest.php:434 +msgid "Data available" +msgstr "" + +#: includes/class-swi-foot-shortcodes.php:929 +msgid "Captain" +msgstr "" + +#: assets/editor-blocks.js:30 +#: assets/editor-blocks.js:258 +msgid "Swiss Football Team Data" +msgstr "" + +#: assets/editor-blocks.js:31 +msgid "Display team standings or match data with guided selection" +msgstr "" + +#: assets/editor-blocks.js:35 +msgid "football" +msgstr "" + +#: assets/editor-blocks.js:36 +msgid "soccer" +msgstr "" + +#: assets/editor-blocks.js:37 +#: assets/editor-blocks.js:339 +msgid "team" +msgstr "" + +#: assets/editor-blocks.js:38 +msgid "swiss" +msgstr "" + +#: assets/editor-blocks.js:133 +msgid "Choose what to display..." +msgstr "" + +#: assets/editor-blocks.js:134 +msgid "Team Statistics (Standings/Ranking)" +msgstr "" + +#: assets/editor-blocks.js:135 +#: src/format-shortcode.js:255 +msgid "Match Data" +msgstr "" + +#: assets/editor-blocks.js:140 +msgid "Complete Match Information" +msgstr "" + +#: assets/editor-blocks.js:141 +msgid "Home Team Name Only" +msgstr "" + +#: assets/editor-blocks.js:142 +msgid "Away Team Name Only" +msgstr "" + +#: assets/editor-blocks.js:143 +msgid "Match Date Only" +msgstr "" + +#: assets/editor-blocks.js:144 +msgid "Match Time Only" +msgstr "" + +#: assets/editor-blocks.js:145 +msgid "Venue/Location Only" +msgstr "" + +#: assets/editor-blocks.js:146 +msgid "Score Only" +msgstr "" + +#: assets/editor-blocks.js:147 +msgid "Match Status Only" +msgstr "" + +#: assets/editor-blocks.js:148 +msgid "League Name Only" +msgstr "" + +#: assets/editor-blocks.js:149 +msgid "Round Number Only" +msgstr "" + +#: assets/editor-blocks.js:154 +msgid "Team Selection" +msgstr "" + +#: assets/editor-blocks.js:157 +msgid "1. Select Team" +msgstr "" + +#: assets/editor-blocks.js:159 +#: assets/editor-blocks.js:423 +#: assets/editor-blocks.js:576 +msgid "Choose a team..." +msgstr "" + +#: assets/editor-blocks.js:176 +msgid "2. What would you like to display?" +msgstr "" + +#: assets/editor-blocks.js:189 +msgid "Match Settings" +msgstr "" + +#: assets/editor-blocks.js:192 +msgid "3. Select Match" +msgstr "" + +#: assets/editor-blocks.js:194 +#: assets/editor-blocks.js:435 +#: assets/editor-blocks.js:587 +msgid "Choose a match..." +msgstr "" + +#: assets/editor-blocks.js:195 +msgid "Current Match (Next upcoming or recent)" +msgstr "" + +#: assets/editor-blocks.js:206 +msgid "4. What match information to display?" +msgstr "" + +#: assets/editor-blocks.js:214 +msgid "Advanced Options" +msgstr "" + +#: assets/editor-blocks.js:216 +msgid "Date/Time Format" +msgstr "" + +#: assets/editor-blocks.js:219 +#: assets/editor-blocks.js:225 +msgid "Default (WordPress setting)" +msgstr "" + +#: assets/editor-blocks.js:234 +msgid "Score Separator" +msgstr "" + +#: assets/editor-blocks.js:261 +msgid "1. Please select a team to get started" +msgstr "" + +#: assets/editor-blocks.js:265 +msgid "2. Please choose what you want to display" +msgstr "" + +#: assets/editor-blocks.js:269 +msgid "Will display team standings/ranking" +msgstr "" + +#: assets/editor-blocks.js:273 +msgid "3. Please select a match" +msgstr "" + +#: assets/editor-blocks.js:278 +msgid "Ready to display match data" +msgstr "" + +#: assets/editor-blocks.js:281 +msgid "Generated shortcode:" +msgstr "" + +#: assets/editor-blocks.js:331 +#: src/editor-blocks.js:137 +msgid "Swiss Football Match Roster" +msgstr "" + +#: assets/editor-blocks.js:332 +msgid "Display match roster for home or away team, with optional bench players" +msgstr "" + +#: assets/editor-blocks.js:336 +msgid "roster" +msgstr "" + +#: assets/editor-blocks.js:337 +msgid "players" +msgstr "" + +#: assets/editor-blocks.js:338 +msgid "lineup" +msgstr "" + +#: assets/editor-blocks.js:417 +#: assets/editor-blocks.js:572 +msgid "Match Selection" +msgstr "" + +#: assets/editor-blocks.js:421 +#: assets/editor-blocks.js:574 +msgid "Select Team" +msgstr "" + +#: assets/editor-blocks.js:433 +#: assets/editor-blocks.js:585 +msgid "Select Match" +msgstr "" + +#: assets/editor-blocks.js:436 +#: assets/editor-blocks.js:588 +msgid "Current Match" +msgstr "" + +#: assets/editor-blocks.js:444 +msgid "Select Side" +msgstr "" + +#: assets/editor-blocks.js:455 msgid "Include Bench Players" msgstr "" -#: src/editor-blocks.js:183 -msgid "Match roster will render on the front-end." +#: assets/editor-blocks.js:456 +msgid "When enabled, bench players will also be displayed" msgstr "" -#: src/editor-blocks.js:199 +#: assets/editor-blocks.js:473 +#: src/editor-blocks.js:177 +msgid "Match Roster" +msgstr "" + +#: assets/editor-blocks.js:476 +msgid "Please select team, match, side, and bench option" +msgstr "" + +#: assets/editor-blocks.js:508 +#: src/editor-blocks.js:197 msgid "Swiss Football Match Events" msgstr "" -#: src/editor-blocks.js:209 +#: assets/editor-blocks.js:509 +msgid "Display live match events with auto-refresh" +msgstr "" + +#: assets/editor-blocks.js:513 +msgid "events" +msgstr "" + +#: assets/editor-blocks.js:514 +msgid "live" +msgstr "" + +#: assets/editor-blocks.js:515 +msgid "timeline" +msgstr "" + +#: assets/editor-blocks.js:516 +msgid "match" +msgstr "" + +#: assets/editor-blocks.js:595 +msgid "Auto-Refresh Settings" +msgstr "" + +#: assets/editor-blocks.js:597 +#: src/editor-blocks.js:214 msgid "Refresh Interval (seconds)" msgstr "" -#: src/editor-blocks.js:217 -msgid "Event Order" +#: assets/editor-blocks.js:616 +msgid "Live Match Events" msgstr "" -#: src/editor-blocks.js:221 -msgid "Dynamic (Newest first while live, chronological after)" +#: assets/editor-blocks.js:618 +msgid "Please select team and match" +msgstr "" + +#: assets/editor-blocks.js:620 +msgid "Will display live match events" +msgstr "" + +#: assets/editor-blocks.js:622 +msgid "Auto-refresh every" +msgstr "" + +#: assets/editor-blocks.js:622 +msgid "seconds" +msgstr "" + +#: src/editor-blocks.js:68 +msgid "Swiss Football Standings" +msgstr "" + +#: src/editor-blocks.js:76 +#: src/editor-blocks.js:311 +msgid "Settings" +msgstr "" + +#: src/editor-blocks.js:77 +#: src/editor-blocks.js:109 +msgid "Team is inherited from the container context." +msgstr "" + +#: src/editor-blocks.js:81 +msgid "Standings" +msgstr "" + +#: src/editor-blocks.js:82 +msgid "League standings inherited from team context. ✓ Data will render on the front-end." +msgstr "" + +#: src/editor-blocks.js:94 +msgid "Swiss Football Schedule" +msgstr "" + +#: src/editor-blocks.js:108 +msgid "Schedule settings" +msgstr "" + +#: src/editor-blocks.js:110 +msgid "Limit" +msgstr "" + +#: src/editor-blocks.js:112 +msgid "Match Filter" +msgstr "" + +#: src/editor-blocks.js:115 +msgid "All Matches" +msgstr "" + +#: src/editor-blocks.js:116 +msgid "Home Matches Only" +msgstr "" + +#: src/editor-blocks.js:117 +msgid "Away Matches Only" +msgstr "" + +#: src/editor-blocks.js:124 +msgid "Schedule" +msgstr "" + +#: src/editor-blocks.js:125 +msgid "Team and match schedule inherited from context. ✓ Data will render on the front-end." +msgstr "" + +#: src/editor-blocks.js:152 +#: src/editor-blocks.js:211 +#: src/editor-blocks.js:272 +msgid "Display Options" +msgstr "" + +#: src/editor-blocks.js:153 +#: src/editor-blocks.js:212 +msgid "Match and team are inherited from the container context." +msgstr "" + +#: src/editor-blocks.js:155 +#: src/editor-blocks.js:275 +msgid "Team Side" +msgstr "" + +#: src/editor-blocks.js:163 +msgid "Show Starting Squad" +msgstr "" + +#: src/editor-blocks.js:169 +msgid "Show Bench" +msgstr "" + +#: src/editor-blocks.js:178 +msgid "Team and match are inherited from the container context. ✓ Data will render on the front-end." msgstr "" #: src/editor-blocks.js:222 +msgid "Event Order" +msgstr "" + +#: src/editor-blocks.js:226 +msgid "Dynamic (Newest first while live, chronological after)" +msgstr "" + +#: src/editor-blocks.js:227 msgid "Newest First" msgstr "" -#: src/editor-blocks.js:223 +#: src/editor-blocks.js:228 msgid "Oldest First" msgstr "" -#: src/editor-blocks.js:225 -msgid "" -"Dynamic: newest events at top while match is ongoing, chronological (oldest " -"first) after match ends" +#: src/editor-blocks.js:230 +msgid "Dynamic: newest events at top while match is ongoing, chronological (oldest first) after match ends" msgstr "" -#: src/editor-blocks.js:229 -msgid "Live events will be displayed on the front-end." +#: src/editor-blocks.js:238 +msgid "Live match events inherited from context. ✓ Will update during match." +msgstr "" + +#: src/editor-blocks.js:258 +msgid "Swiss Football Match Bench" +msgstr "" + +#: src/editor-blocks.js:273 +#: src/editor-blocks.js:312 +msgid "Match is inherited from the container context." +msgstr "" + +#: src/editor-blocks.js:285 +msgid "Match Bench" +msgstr "" + +#: src/editor-blocks.js:286 +msgid "Team bench and substitutes inherited from context. ✓ Data will render on the front-end." +msgstr "" + +#: src/editor-blocks.js:302 +msgid "Swiss Football Match Referees" +msgstr "" + +#: src/editor-blocks.js:316 +msgid "Match Referees" +msgstr "" + +#: src/editor-blocks.js:317 +msgid "Match officials and referees inherited from context. ✓ Data will render on the front-end." msgstr "" #: src/format-shortcode.js:31 @@ -624,8 +1145,10 @@ msgstr "" msgid "Gastteam Logo (URL)" msgstr "" -#: src/format-shortcode.js:229 src/format-shortcode.js:242 -#: src/format-shortcode.js:356 src/format-shortcode.js:390 +#: src/format-shortcode.js:229 +#: src/format-shortcode.js:242 +#: src/format-shortcode.js:360 +#: src/format-shortcode.js:394 msgid "Insert Match Data" msgstr "" @@ -633,10 +1156,6 @@ msgstr "" msgid "No match data available on this page. Please add match context first." msgstr "" -#: src/format-shortcode.js:255 -msgid "Match Data" -msgstr "" - #: src/format-shortcode.js:265 msgid "Shortcodes" msgstr "" @@ -649,30 +1168,126 @@ msgstr "" msgid "Select which match data to display" msgstr "" -#: src/format-shortcode.js:289 +#: src/format-shortcode.js:291 msgid "Preview:" msgstr "" -#: src/format-shortcode.js:297 +#: src/format-shortcode.js:299 msgid "(no value)" msgstr "" -#: src/format-shortcode.js:307 +#: src/format-shortcode.js:309 msgid "Insert Data" msgstr "" -#: src/format-shortcode.js:320 +#: src/format-shortcode.js:322 msgid "Shortcode" msgstr "" -#: src/format-shortcode.js:324 +#: src/format-shortcode.js:326 msgid "Select a shortcode to insert (logos, etc.)" msgstr "" -#: src/format-shortcode.js:331 +#: src/format-shortcode.js:335 msgid "Shortcode:" msgstr "" -#: src/format-shortcode.js:341 +#: src/format-shortcode.js:345 msgid "Insert Shortcode" msgstr "" + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block title" +msgid "Swiss Football Context (container)" +msgstr "" + +#: blocks/context/block.json +#: dist/swiss-football-matchdata/blocks/context/block.json +msgctxt "block description" +msgid "Provides a team/season/match context to child blocks. Children will inherit these settings unless they override them." +msgstr "" + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block title" +msgid "Swiss Football Match Bench" +msgstr "" + +#: blocks/match-bench/block.json +#: dist/swiss-football-matchdata/blocks/match-bench/block.json +msgctxt "block description" +msgid "Display team staff and substitutes for a match" +msgstr "" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block title" +msgid "Swiss Football Match Events" +msgstr "" + +#: blocks/match-events/block.json +#: dist/swiss-football-matchdata/blocks/match-events/block.json +msgctxt "block description" +msgid "Live match events with optional auto-refresh." +msgstr "" + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block title" +msgid "Swiss Football Match Referees" +msgstr "" + +#: blocks/match-referees/block.json +#: dist/swiss-football-matchdata/blocks/match-referees/block.json +msgctxt "block description" +msgid "Display match officials and referees" +msgstr "" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block title" +msgid "Swiss Football Match Roster" +msgstr "" + +#: blocks/match-roster/block.json +#: dist/swiss-football-matchdata/blocks/match-roster/block.json +msgctxt "block description" +msgid "Display match roster for a selected match and side." +msgstr "" + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block title" +msgid "Swiss Football Schedule" +msgstr "" + +#: blocks/schedule/block.json +#: dist/swiss-football-matchdata/blocks/schedule/block.json +msgctxt "block description" +msgid "Display upcoming matches for a team." +msgstr "" + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block title" +msgid "SWI Football Shortcode Inserter" +msgstr "" + +#: blocks/shortcode-inserter/block.json +#: dist/swiss-football-matchdata/blocks/shortcode-inserter/block.json +msgctxt "block description" +msgid "Insert shortcode-based match or team displays." +msgstr "" + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block title" +msgid "Swiss Football Standings" +msgstr "" + +#: blocks/standings/block.json +#: dist/swiss-football-matchdata/blocks/standings/block.json +msgctxt "block description" +msgid "Display current standings for a team." +msgstr "" diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..449bed7 --- /dev/null +++ b/readme.txt @@ -0,0 +1,182 @@ +=== Swiss Football Matchdata === +Contributors: David Reindl +Tags: football, soccer, swiss football, sports, matches, standings, schedules, shortcodes, gutenberg +Requires at least: 5.0 +Tested up to: 6.4 +Stable tag: 1.0.0 +Requires PHP: 7.4 +License: GPL v2 or later +License URI: https://www.gnu.org/licenses/gpl-2.0.html + +Connect to Swiss Football Association API to display match data, standings, and schedules with flexible shortcodes and Gutenberg blocks. + +== Description == + +Swiss Football Matchdata plugin allows you to integrate with the Swiss Football Association API to display: + +* Current team standings/rankings +* Upcoming match schedules +* Detailed match information +* Individual match elements via shortcodes +* Easy Gutenberg block integration + +The plugin features smart caching (configurable duration), automatic token management, and provides both Gutenberg blocks and shortcodes for maximum flexibility. + += Key Features = + +* **Flexible Shortcodes**: Insert individual match elements anywhere in your content +* **Smart Caching**: Configurable cache duration for optimal performance (10-300 seconds) +* **Gutenberg Integration**: Easy-to-use blocks and shortcode inserter for the block editor +* **API Management**: Built-in token refresh and error handling +* **Responsive Design**: Mobile-friendly display of all data +* **Configurable Base URL**: Set your own API endpoint +* **Team Management**: Automatic team list fetching and caching + += Available Shortcodes = + +**Full Match Display:** +* `[swi_foot_match match_id="12345"]` - Complete match information +* `[swi_foot_match team_id="67" show_next="true"]` - Next match for team + +**Individual Match Elements:** +* `[swi_foot_match_home_team match_id="12345"]` - Home team name +* `[swi_foot_match_away_team match_id="12345"]` - Away team name +* `[swi_foot_match_date match_id="12345" format="d.m.Y"]` - Match date +* `[swi_foot_match_time match_id="12345" format="H:i"]` - Match time +* `[swi_foot_match_venue match_id="12345"]` - Match venue +* `[swi_foot_match_score match_id="12345" separator=":"]` - Current score +* `[swi_foot_match_status match_id="12345"]` - Match status +* `[swi_foot_match_league match_id="12345"]` - League name +* `[swi_foot_match_round match_id="12345"]` - Round number + += Gutenberg Blocks = + +* **Swiss Football Context** - Set shared context (team, season) for child blocks +* **Swiss Football Standings** - Display team rankings and standings +* **Swiss Football Schedule** - Show upcoming matches for a team +* **Swiss Football Match Roster** - Display player rosters for a match +* **Swiss Football Match Events** - Show match events (goals, cards, substitutions) with live updates +* **Swiss Football Match Referees** - Display referee information +* **Swiss Football Shortcode** - Insert custom shortcodes with visual interface (deprecated, use paragraph toolbar instead) + += Usage Examples = + +**Simple Match Display:** +`[swi_foot_match match_id="12345"]` + +**Next Match for Team:** +`[swi_foot_match team_id="67" show_next="true"]` + +**Individual Elements in Text:** +`The match between [swi_foot_match_home_team match_id="12345"] and [swi_foot_match_away_team match_id="12345"] will be played on [swi_foot_match_date match_id="12345" format="F j, Y"] at [swi_foot_match_time match_id="12345" format="g:i A"] in [swi_foot_match_venue match_id="12345"]. +Current score: [swi_foot_match_score match_id="12345"]` + + +== Installation == + +1. Upload the plugin files to `/wp-content/plugins/swiss-football-matchdata/` +2. Activate the plugin through the 'Plugins' screen in WordPress +3. Go to Settings → Swiss Football to configure your API credentials +4. Enter your API base URL, username (application key), password (application pass), Verein ID, and Season ID +5. Test the connection and refresh your teams list +6. Start using the shortcodes and blocks in your content + +== Configuration == + +After activation, configure these settings in Settings → Swiss Football: + +**API Configuration:** +* **API Base URL**: The Swiss Football API endpoint (default: https://stg-club-api-services.football.ch) +* **API Username**: Your application key from Swiss Football +* **API Password**: Your application password from Swiss Football +* **Verein ID**: Your club's unique identifier +* **Season ID**: Current season (usually the year) + +**Cache Settings:** +* **Match Data Cache Duration**: How long to cache match data (10-300 seconds, default: 30) + +== Frequently Asked Questions == + += How do I get API credentials? = + +Contact the Swiss Football Association to obtain your application key, application password, and Verein ID. + += How often is data updated? = + +Match data is cached according to your configured cache duration (default 30 seconds). The cache is automatically refreshed when pages with shortcodes are loaded. + += Can I customize the display styling? = + +Yes, the plugin includes CSS classes you can target: +* `.swi-foot-match-container` - Full match displays +* `.swi-foot-standings` - Standings tables +* `.swi-foot-schedule` - Schedule lists +* `.swi-foot-inline` - Individual shortcode elements +* `.swi-foot-error` - Error messages + += What happens if the API is unavailable? = + +The plugin will display cached data if available, or show appropriate error messages. It includes robust error handling and logging. + += How do I use shortcodes in the Gutenberg editor? = + +Click the shortcode icon in any paragraph's toolbar to quickly insert shortcodes. You can also use the "Swiss Football Shortcode" block (now deprecated) for backwards compatibility. + += Can I display data for multiple teams? = + +Yes, you can use different team IDs in different shortcodes and blocks throughout your site. + += How do I find my team's ID? = + +After configuring your API credentials, go to Settings → Swiss Football and click "Refresh Teams List". This will display all available teams with their IDs. + += Can I use custom date/time formats? = + +Yes, use the `format` parameter in date and time shortcodes with PHP date format strings (e.g., `format="d.m.Y"` for European date format). + += Does the plugin work with caching plugins? = + +Yes, the plugin's internal caching system works alongside WordPress caching plugins. The 30-second cache ensures fresh data while minimizing API calls. + +== Screenshots == + +1. Admin settings page with API configuration and team management +2. Shortcode helper meta box in post editor with click-to-copy functionality +3. Gutenberg shortcode inserter block with visual interface +4. Example standings table display on frontend +5. Example match schedule display with upcoming games +6. Individual shortcode elements integrated in post content +7. Cache management and connection testing interface + +== Changelog == + += 1.0.0 = +* Initial release +* Swiss Football API integration with automatic token management +* Comprehensive shortcode system for individual match elements +* Configurable caching system (10-300 seconds) +* Gutenberg blocks for standings, schedules, rosters, and events +* Context provider block for scoped data +* Admin interface for configuration and team management +* Responsive design and error handling +* Support for configurable API base URL +* Click-to-copy shortcode functionality in admin +* Smart cache updates on page load +* Paragraph toolbar shortcode insertion + +== Upgrade Notice == + += 1.0.0 = +Initial release of Swiss Football Matchdata plugin with comprehensive API integration and flexible shortcode system. + +== Support == + +For support, feature requests, or bug reports, please contact the plugin author or visit the plugin's support forum. + +== Privacy == + +This plugin connects to the Swiss Football Association API to retrieve match data. No personal data from your website visitors is sent to external services. The plugin only sends: +* API credentials (application key/password) for authentication +* Club/team identifiers to retrieve relevant match data + +All data is cached locally on your WordPress installation according to your configured cache duration. diff --git a/src/editor-blocks.js b/src/editor-blocks.js index fcb6301..9fd355b 100644 --- a/src/editor-blocks.js +++ b/src/editor-blocks.js @@ -49,11 +49,24 @@ function makeAjaxCall(action, data = {}) { }); } +function checkBlockStatus(matchId, endpoint) { + if (!matchId) return Promise.resolve(null); + + const root = swiFootEditorData.rest_url.replace(/\/$/, ''); + const url = `${root}/block-status/${matchId}/${endpoint}`; + const opts = { credentials: 'same-origin', headers: { 'X-WP-Nonce': swiFootEditorData.rest_nonce } }; + + return fetch(url, opts) + .then(r => r.json()) + .catch(() => null); +} + // Standings block (editor UI only, server renders) // Gets team from container context, no user selection needed registerBlockType('swi-foot/standings', { + apiVersion: 3, title: __('Swiss Football Standings', 'swi_foot_matchdata'), - category: 'embed', + category: 'swi-football', supports: { align: true, anchor: true }, edit: ({ attributes, setAttributes, isSelected }) => { const blockProps = useBlockProps({ style: isSelected ? {outline: '2px solid #0073aa'} : {} }); @@ -64,7 +77,10 @@ registerBlockType('swi-foot/standings', {

{__('Team is inherited from the container context.', 'swi_foot_matchdata')}

-
{__('Standings will render on the front-end.', 'swi_foot_matchdata')}
+
+

{__('Standings', 'swi_foot_matchdata')}

+

{__('League standings inherited from team context. ✓ Data will render on the front-end.', 'swi_foot_matchdata')}

+
); }, @@ -74,15 +90,17 @@ registerBlockType('swi-foot/standings', { // Schedule block (editor UI only, server renders) // Gets team from container context, only allows limiting results registerBlockType('swi-foot/schedule', { + apiVersion: 3, title: __('Swiss Football Schedule', 'swi_foot_matchdata'), - category: 'embed', + category: 'swi-football', supports: { align: true, anchor: true }, attributes: { - limit: { type: 'number', default: 10 } + limit: { type: 'number', default: 10 }, + matchFilter: { type: 'string', default: 'all' } }, edit: ({ attributes, setAttributes, isSelected }) => { const blockProps = useBlockProps({ style: isSelected ? {outline: '2px solid #0073aa'} : {} }); - const { limit } = attributes; + const { limit, matchFilter } = attributes; return (
@@ -90,106 +108,43 @@ registerBlockType('swi-foot/schedule', {

{__('Team is inherited from the container context.', 'swi_foot_matchdata')}

setAttributes({ limit: val })} min={1} max={20} /> + setAttributes({ matchFilter: val })} + />
-
{__('Upcoming matches will render on the front-end.', 'swi_foot_matchdata')}
+
+

{__('Schedule', 'swi_foot_matchdata')}

+

{__('Team and match schedule inherited from context. ✓ Data will render on the front-end.', 'swi_foot_matchdata')}

+
); }, save: ({ attributes }) => null }); -/** - * NOTE: The shortcode-inserter block has been deprecated in favor of the - * paragraph toolbar button (SWI Inline Format) which provides a better UX. - * Users should use the toolbar button or the team-data block below. - */ - -// Team Data composite block (generates shortcodes) -registerBlockType('swi-foot/team-data', { - title: __('Swiss Football Team Data', 'swi_foot_matchdata'), - category: 'embed', - supports: { align: true, anchor: true }, - attributes: { - selectedTeam: { type: 'string', default: '' }, - dataType: { type: 'string', default: '' }, - selectedMatch: { type: 'string', default: '' }, - shortcodeType: { type: 'string', default: 'standings' }, - format: { type: 'string', default: '' }, - separator: { type: 'string', default: ':' } - }, - edit: ({ attributes, setAttributes, isSelected }) => { - const blockProps = useBlockProps({ style: isSelected ? {outline: '2px solid #0073aa'} : {} }); - const { selectedTeam, dataType, selectedMatch, shortcodeType, format, separator } = attributes; - const [teams, setTeams] = useState([]); - const [matches, setMatches] = useState([]); - const [loadingTeams, setLoadingTeams] = useState(true); - const [loadingMatches, setLoadingMatches] = useState(false); - - useEffect(() => { - makeAjaxCall('swi_foot_get_teams_for_editor').then(r => { if (r.success) setTeams(r.data); setLoadingTeams(false); }).catch(()=>setLoadingTeams(false)); - }, []); - - useEffect(() => { - if (selectedTeam && dataType === 'match') { - setLoadingMatches(true); - makeAjaxCall('swi_foot_get_matches_for_team', { team_id: selectedTeam }) - .then(r => { if (r.success) setMatches(r.data); setLoadingMatches(false); }) - .catch(()=>setLoadingMatches(false)); - } else { - setMatches([]); - } - }, [selectedTeam, dataType]); - - // preview/controls omitted for brevity — editor-blocks.js contains full UI - return ( -
- - - {loadingTeams ? : ( - ({value:t.value,label:t.label})))} - onChange={val=>setAttributes({selectedTeam:val, dataType:'', selectedMatch:''})} />)} - - {selectedTeam && ( - setAttributes({dataType:val, selectedMatch:''})} /> - )} - - -
{__('Team data shortcode generator', 'swi_foot_matchdata')}
-
- ); - }, - save: ({ attributes }) => { - const { selectedTeam, dataType, selectedMatch, shortcodeType, format, separator } = attributes; - if (selectedTeam && dataType === 'stats') return createElement(RawHTML, null, `[swi_foot_standings team_id="${selectedTeam}"]`); - if (selectedTeam && dataType === 'match' && selectedMatch) { - let s = ''; - if (selectedMatch === 'current') s = `[swi_foot_${shortcodeType} team_id="${selectedTeam}" show_current="true"`; - else s = `[swi_foot_${shortcodeType} match_id="${selectedMatch}"`; - if (format && (shortcodeType==='match_date' || shortcodeType==='match_time')) s += ` format="${format}"`; - if (separator!==':' && shortcodeType==='match_score') s += ` separator="${separator}"`; - s += ']'; - return createElement(RawHTML, null, s); - } - return ''; - } -}); - // Match Roster // Gets match and team from container context, only allows selecting which side (home/away) and bench option registerBlockType('swi-foot/match-roster', { + apiVersion: 3, title: __('Swiss Football Match Roster', 'swi_foot_matchdata'), - category: 'embed', + category: 'swi-football', supports: { align: true, anchor: true }, attributes: { side: { type: 'string', default: 'home' }, - withBench: { type: 'boolean', default: false } + showStartingSquad: { type: 'boolean', default: true }, + showBench: { type: 'boolean', default: false } }, edit: ({ attributes, setAttributes, isSelected }) => { const blockProps = useBlockProps({ style: isSelected ? {outline: '2px solid #0073aa'} : {} }); - const { side, withBench } = attributes; + const { side, showStartingSquad, showBench } = attributes; return (
@@ -201,22 +156,35 @@ registerBlockType('swi-foot/match-roster', { value={side} options={[{value:'home',label:__('Home Team', 'swi_foot_matchdata')},{value:'away',label:__('Away Team', 'swi_foot_matchdata')}]} onChange={v=>setAttributes({side:v})} + __next40pxDefaultSize={true} + __nextHasNoMarginBottom={true} /> setAttributes({withBench:v})} + label={__('Show Starting Squad', 'swi_foot_matchdata')} + checked={showStartingSquad} + onChange={v=>setAttributes({showStartingSquad:v})} + __nextHasNoMarginBottom={true} + /> + setAttributes({showBench:v})} + __nextHasNoMarginBottom={true} /> -
{__('Match roster will render on the front-end.', 'swi_foot_matchdata')}
+
+

{__('Match Roster', 'swi_foot_matchdata')}

+

{__('Team and match are inherited from the container context. ✓ Data will render on the front-end.', 'swi_foot_matchdata')}

+
); }, save: ({ attributes }) => { - const { side, withBench } = attributes; + const { side, showStartingSquad, showBench } = attributes; let shortcode = '[swi_foot_roster side="' + side + '"'; - if (withBench) shortcode += ' with_bench="true"'; + if (showStartingSquad) shortcode += ' starting_squad="true"'; + if (showBench) shortcode += ' bench="true"'; shortcode += ']'; return createElement(RawHTML, null, shortcode); } @@ -225,8 +193,9 @@ registerBlockType('swi-foot/match-roster', { // Match Events // Gets match and team from container context, only allows setting refresh interval registerBlockType('swi-foot/match-events', { + apiVersion: 3, title: __('Swiss Football Match Events', 'swi_foot_matchdata'), - category: 'embed', + category: 'swi-football', supports: { align: true, anchor: true }, attributes: { refreshInterval: { type: 'number', default: 30 }, @@ -259,10 +228,15 @@ registerBlockType('swi-foot/match-events', { { label: __('Oldest First', 'swi_foot_matchdata'), value: 'oldest_first' } ]} help={__('Dynamic: newest events at top while match is ongoing, chronological (oldest first) after match ends', 'swi_foot_matchdata')} + __next40pxDefaultSize={true} + __nextHasNoMarginBottom={true} /> -
{__('Live events will be displayed on the front-end.', 'swi_foot_matchdata')}
+
+

{__('Match Events', 'swi_foot_matchdata')}

+

{__('Live match events inherited from context. ✓ Will update during match.', 'swi_foot_matchdata')}

+
); }, @@ -277,3 +251,74 @@ registerBlockType('swi-foot/match-events', { } }); +// Match Bench +// Gets match from container context, displays team staff and bench players +registerBlockType('swi-foot/match-bench', { + apiVersion: 3, + title: __('Swiss Football Match Bench', 'swi_foot_matchdata'), + icon: 'clipboard-user', + category: 'swi-football', + supports: { align: true, anchor: true }, + attributes: { + side: { type: 'string', default: 'home' } + }, + edit: ({ attributes, setAttributes, isSelected }) => { + const blockProps = useBlockProps({ style: isSelected ? {outline: '2px solid #0073aa'} : {} }); + const { side } = attributes; + + return ( +
+ + +

{__('Match is inherited from the container context.', 'swi_foot_matchdata')}

+ setAttributes({side:v})} + __next40pxDefaultSize={true} + __nextHasNoMarginBottom={true} + /> +
+
+
+

{__('Match Bench', 'swi_foot_matchdata')}

+

{__('Team bench and substitutes inherited from context. ✓ Data will render on the front-end.', 'swi_foot_matchdata')}

+
+
+ ); + }, + save: ({ attributes }) => { + const { side } = attributes; + let shortcode = '[swi_foot_bench side="' + side + '"]'; + return createElement(RawHTML, null, shortcode); + } +}); + +// Match Referees +// Gets match from container context, displays match officials and referees +registerBlockType('swi-foot/match-referees', { + apiVersion: 3, + title: __('Swiss Football Match Referees', 'swi_foot_matchdata'), + icon: 'whistle', + category: 'swi-football', + supports: { align: true, anchor: true }, + edit: ({ attributes, isSelected }) => { + const blockProps = useBlockProps({ style: isSelected ? {outline: '2px solid #0073aa'} : {} }); + return ( +
+ + +

{__('Match is inherited from the container context.', 'swi_foot_matchdata')}

+
+
+
+

{__('Match Referees', 'swi_foot_matchdata')}

+

{__('Match officials and referees inherited from context. ✓ Data will render on the front-end.', 'swi_foot_matchdata')}

+
+
+ ); + }, + save: () => null +}); + diff --git a/src/format-shortcode.js b/src/format-shortcode.js index 839cf05..f399b80 100644 --- a/src/format-shortcode.js +++ b/src/format-shortcode.js @@ -280,6 +280,8 @@ function InlineDataModal( { onInsert, onClose, matchId } ) { options={ INLINE_DATA_POINTS } onChange={ setSelectedDataPoint } help={ __( 'Select which match data to display', 'swi_foot_matchdata' ) } + __next40pxDefaultSize={true} + __nextHasNoMarginBottom={true} /> @@ -322,6 +324,8 @@ function InlineDataModal( { onInsert, onClose, matchId } ) { options={ SHORTCODE_OPTIONS } onChange={ setSelectedShortcode } help={ __( 'Select a shortcode to insert (logos, etc.)', 'swi_foot_matchdata' ) } + __next40pxDefaultSize={true} + __nextHasNoMarginBottom={true} /> diff --git a/swiss-football-matchdata.php b/swiss-football-matchdata.php index 5bb4981..476c9bd 100644 --- a/swiss-football-matchdata.php +++ b/swiss-football-matchdata.php @@ -35,6 +35,15 @@ class Swiss_Football_Matchdata { } public function init() { + // Detect version updates and flush REST API routes cache if needed + $stored_version = get_option('swi_foot_plugin_version'); + if ($stored_version !== SWI_FOOT_PLUGIN_VERSION) { + // Plugin was updated, clear REST endpoints cache + delete_transient('rest_endpoints_data'); + wp_cache_delete('rest_endpoints', 'swi-foot/v1'); + update_option('swi_foot_plugin_version', SWI_FOOT_PLUGIN_VERSION); + } + // Register post meta to store per-post context (season/team/match) for posts and pages $meta_args = array( 'type' => 'object', @@ -80,9 +89,14 @@ class Swiss_Football_Matchdata { add_option('swi_foot_verein_id', ''); add_option('swi_foot_season_id', date('Y')); // Current year as default add_option('swi_foot_match_cache_duration', 30); + add_option('swi_foot_plugin_version', SWI_FOOT_PLUGIN_VERSION); // Flush rewrite rules flush_rewrite_rules(); + + // Clear REST API route caches + delete_transient('rest_endpoints_data'); + wp_cache_delete('rest_endpoints', 'swi-foot/v1'); } public function deactivate() {