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 7f8b2e9..0000000 Binary files a/languages/swi_foot_matchdata-de_CH.mo and /dev/null differ diff --git a/languages/swi_foot_matchdata-de_CH.po b/languages/swi_foot_matchdata-de_CH.po deleted file mode 100644 index d92c1b4..0000000 --- a/languages/swi_foot_matchdata-de_CH.po +++ /dev/null @@ -1,705 +0,0 @@ -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: de_CH\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: includes/class-swi-foot-admin.php:18 includes/class-swi-foot-admin.php:249 -msgid "Swiss Football Matchdata Settings" -msgstr "Swiss Football Matchdata Einstellungen" - -#: includes/class-swi-foot-admin.php:19 -msgid "Swiss Football" -msgstr "Swiss Football" - -#: includes/class-swi-foot-admin.php:37 -#, fuzzy -msgid "API Configuration" -msgstr "API-Verbindung testen" - -#: includes/class-swi-foot-admin.php:42 -msgid "API Base URL" -msgstr "API Basis-URL" - -#: includes/class-swi-foot-admin.php:43 -msgid "API Username (Application Key)" -msgstr "API Benutzername (Application Key)" - -#: includes/class-swi-foot-admin.php:44 -msgid "API Password (Application Pass)" -msgstr "API Passwort (Application Pass)" - -#: includes/class-swi-foot-admin.php:45 -msgid "Verein ID (Club ID)" -msgstr "Vereins-ID (Club ID)" - -#: includes/class-swi-foot-admin.php:46 -msgid "Season ID" -msgstr "Saison-ID" - -#: includes/class-swi-foot-admin.php:50 -msgid "Cache Settings" -msgstr "" - -#: includes/class-swi-foot-admin.php:55 -msgid "Match Data Cache Duration (seconds)" -msgstr "Cache-Dauer für Spieldaten (Sekunden)" - -#: includes/class-swi-foot-admin.php:60 -msgid "Configure your Swiss Football API credentials here." -msgstr "" - -#: includes/class-swi-foot-admin.php:65 -msgid "Configure caching settings for match data." -msgstr "" - -#: includes/class-swi-foot-admin.php:72 -msgid "The base URL for the Swiss Football API" -msgstr "" - -#: includes/class-swi-foot-admin.php:79 -#, fuzzy -msgid "Your API application key" -msgstr "API Benutzername (Application Key)" - -#: includes/class-swi-foot-admin.php:86 -#, fuzzy -msgid "Your API application password" -msgstr "API Passwort (Application Pass)" - -#: includes/class-swi-foot-admin.php:93 -#, fuzzy -msgid "Enter your club's Verein ID (Club ID)" -msgstr "Vereins-ID (Club ID)" - -#: includes/class-swi-foot-admin.php:100 -msgid "Current season ID (usually the year)" -msgstr "" - -#: includes/class-swi-foot-admin.php:107 -msgid "How long to cache match data in seconds (10-300)" -msgstr "" - -#: includes/class-swi-foot-admin.php:175 -#, fuzzy -msgid "Swiss Football Shortcodes" -msgstr "Swiss Football" - -#: includes/class-swi-foot-admin.php:187 -msgid "Available Shortcodes:" -msgstr "" - -#: includes/class-swi-foot-admin.php:190 -msgid "Full Match Display:" -msgstr "" - -#: includes/class-swi-foot-admin.php:196 -msgid "Individual Match Elements:" -msgstr "" - -#: includes/class-swi-foot-admin.php:209 -msgid "Parameters:" -msgstr "" - -#: includes/class-swi-foot-admin.php:219 -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 -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 "API-Verbindung testen" - -#: includes/class-swi-foot-admin.php:270 -msgid "Team Management" -msgstr "" - -#: includes/class-swi-foot-admin.php:273 -msgid "Refresh Teams List" -msgstr "Mannschaftsliste aktualisieren" - -#: includes/class-swi-foot-admin.php:284 -msgid "Cache Management" -msgstr "" - -#: includes/class-swi-foot-admin.php:287 -msgid "Clear Match Data Cache" -msgstr "Spieldaten-Cache leeren" - -#: includes/class-swi-foot-admin.php:295 -#, fuzzy -msgid "Finished Matches Data" -msgstr "Alle beendeten Spiele löschen" - -#: includes/class-swi-foot-admin.php:300 -msgid "Quick Shortcode Reference" -msgstr "" - -#: includes/class-swi-foot-admin.php:303 -msgid "Common Examples:" -msgstr "" - -#: includes/class-swi-foot-admin.php:304 -msgid "Display full match info:" -msgstr "" - -#: includes/class-swi-foot-admin.php:308 -msgid "Show next match for a team:" -msgstr "" - -#: includes/class-swi-foot-admin.php:312 -msgid "Individual elements in text:" -msgstr "" - -#: includes/class-swi-foot-admin.php:313 -msgid "The match between" -msgstr "" - -#: includes/class-swi-foot-admin.php:313 -msgid "and" -msgstr "" - -#: includes/class-swi-foot-admin.php:313 -msgid "is on" -msgstr "" - -#: includes/class-swi-foot-admin.php:328 -#, php-format -msgid "Error loading teams: %s" -msgstr "" - -#: includes/class-swi-foot-admin.php:335 -msgid "No teams found. Please check your API configuration." -msgstr "" - -#: includes/class-swi-foot-admin.php:340 -msgid "Available Teams:" -msgstr "" - -#: includes/class-swi-foot-admin.php:360 -#, php-format -msgid "Currently caching %d match records with %d second cache duration." -msgstr "" - -#: includes/class-swi-foot-admin.php:375 -msgid "Cache Range:" -msgstr "" - -#: includes/class-swi-foot-admin.php:376 -msgid "Oldest:" -msgstr "" - -#: includes/class-swi-foot-admin.php:377 -msgid "Newest:" -msgstr "" - -#: includes/class-swi-foot-admin.php:386 -msgid "No finished match data stored." -msgstr "Keine gespeicherten, beendeten Spiele vorhanden." - -#: includes/class-swi-foot-admin.php:393 -#, fuzzy -msgid "Match ID" -msgstr "Spielkader" - -#: includes/class-swi-foot-admin.php:394 -msgid "Saved At" -msgstr "" - -#: includes/class-swi-foot-admin.php:395 -msgid "Players" -msgstr "" - -#: includes/class-swi-foot-admin.php:396 -#: includes/class-swi-foot-shortcodes.php:768 -msgid "Bench" -msgstr "Ersatzbank" - -#: includes/class-swi-foot-admin.php:397 -#, fuzzy -msgid "Events" -msgstr "Spielereignisse" - -#: includes/class-swi-foot-admin.php:415 -msgid "Delete" -msgstr "Löschen" - -#: includes/class-swi-foot-admin.php:421 -msgid "Clear All Finished Matches" -msgstr "Alle beendeten Spiele löschen" - -#: includes/class-swi-foot-admin.php:428 -#, fuzzy -msgid "Delete this finished match data?" -msgstr "Keine gespeicherten, beendeten Spiele vorhanden." - -#: includes/class-swi-foot-admin.php:445 -#, fuzzy -msgid "Clear all finished match data?" -msgstr "Alle beendeten Spiele löschen" - -#: includes/class-swi-foot-blocks.php:218 -msgid "Standings: No team provided in container context." -msgstr "" - -#: includes/class-swi-foot-blocks.php:226 -#, php-format -msgid "Error loading standings: %s" -msgstr "" - -#: includes/class-swi-foot-blocks.php:231 -msgid "No standings data available." -msgstr "Keine Ranglistendaten verfügbar." - -#: includes/class-swi-foot-blocks.php:237 -#: includes/class-swi-foot-shortcodes.php:631 -msgid "Current Standings" -msgstr "Aktuelle Rangliste" - -#: includes/class-swi-foot-blocks.php:241 -#: includes/class-swi-foot-shortcodes.php:635 -msgid "Pos" -msgstr "" - -#: includes/class-swi-foot-blocks.php:242 -#: includes/class-swi-foot-shortcodes.php:636 -#, fuzzy -msgid "Team" -msgstr "Heimmannschaft" - -#: includes/class-swi-foot-blocks.php:243 -#: includes/class-swi-foot-shortcodes.php:637 -msgid "P" -msgstr "" - -#: includes/class-swi-foot-blocks.php:244 -#: includes/class-swi-foot-shortcodes.php:638 -msgid "W" -msgstr "" - -#: includes/class-swi-foot-blocks.php:245 -#: includes/class-swi-foot-shortcodes.php:639 -msgid "D" -msgstr "" - -#: includes/class-swi-foot-blocks.php:246 -#: includes/class-swi-foot-shortcodes.php:640 -msgid "L" -msgstr "" - -#: includes/class-swi-foot-blocks.php:247 -#: includes/class-swi-foot-shortcodes.php:641 -msgid "GF" -msgstr "" - -#: includes/class-swi-foot-blocks.php:248 -#: includes/class-swi-foot-shortcodes.php:642 -msgid "GA" -msgstr "" - -#: includes/class-swi-foot-blocks.php:249 -#: includes/class-swi-foot-shortcodes.php:643 -msgid "Pts" -msgstr "" - -#: includes/class-swi-foot-blocks.php:286 -msgid "Schedule: No team provided in container context." -msgstr "" - -#: includes/class-swi-foot-blocks.php:294 -#, php-format -msgid "Error loading schedule: %s" -msgstr "" - -#: includes/class-swi-foot-blocks.php:314 -msgid "Upcoming Matches" -msgstr "Bevorstehende Spiele" - -#: includes/class-swi-foot-blocks.php:316 -msgid "No upcoming matches scheduled." -msgstr "Keine anstehenden Spiele geplant." - -#: includes/class-swi-foot-blocks.php:406 -msgid "Match Roster: No match provided in container context." -msgstr "" - -#: includes/class-swi-foot-blocks.php:438 -msgid "Match Events: No match provided in container context." -msgstr "" - -#: includes/class-swi-foot-blocks.php:455 -msgid "Please configure your API settings and ensure teams are available." -msgstr "" - -#: includes/class-swi-foot-blocks.php:462 -#, php-format -msgid "Please select a team to display %s:" -msgstr "" - -#: includes/class-swi-foot-blocks.php:464 -msgid "Select a team..." -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:201 -#, fuzzy -msgid "Match data not available" -msgstr "Keine Ranglistendaten verfügbar." - -#: 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 -#, fuzzy -msgid "Standings data not available" -msgstr "Keine Ranglistendaten verfügbar." - -#: 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 -msgid "Match ID required" -msgstr "" - -#: includes/class-swi-foot-shortcodes.php:703 -#, fuzzy -msgid "Roster data not available" -msgstr "Keine Ranglistendaten verfügbar." - -#: includes/class-swi-foot-shortcodes.php:743 -#, fuzzy -msgid "Team Roster" -msgstr "Spielkader" - -#: includes/class-swi-foot-shortcodes.php:764 -#, fuzzy -msgid "No roster data available." -msgstr "Keine Ranglistendaten verfügbar." - -#: includes/class-swi-foot-shortcodes.php:822 -#, fuzzy -msgid "Events data not available" -msgstr "Keine Ranglistendaten verfügbar." - -#: includes/class-swi-foot-shortcodes.php:882 -#, fuzzy -msgid "Live match events" -msgstr "Spielereignisse" - -#: includes/class-swi-foot-shortcodes.php:883 -msgid "Match Events" -msgstr "Spielereignisse" - -#: includes/class-swi-foot-shortcodes.php:889 -#, fuzzy -msgid "Match minute" -msgstr "Spielereignisse" - -#: includes/class-swi-foot-shortcodes.php:950 -msgid "No events recorded yet." -msgstr "Bisher keine Ereignisse erfasst." - -#: 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 -#, fuzzy -msgid "Swiss Football Team Data" -msgstr "Swiss Football" - -#: 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 -#, fuzzy -msgid "Standings" -msgstr "Aktuelle Rangliste" - -#: src/editor-blocks.js:133 -#, fuzzy -msgid "Match" -msgstr "Spielkader" - -#: src/editor-blocks.js:138 -msgid "Team data shortcode generator" -msgstr "" - -#: src/editor-blocks.js:161 -msgid "Swiss Football Match Roster" -msgstr "Schweizer Fussball Spielerliste" - -#: 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 -#, fuzzy -msgid "Team Side" -msgstr "Heimmannschaft" - -#: src/editor-blocks.js:173 -#, fuzzy -msgid "Home Team" -msgstr "Heimmannschaft" - -#: src/editor-blocks.js:173 -msgid "Away Team" -msgstr "Gastmannschaft" - -#: src/editor-blocks.js:177 -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 -msgid "Swiss Football Match Events" -msgstr "Schweizer Fussball Match-Ereignisse" - -#: src/editor-blocks.js:209 -msgid "Refresh Interval (seconds)" -msgstr "" - -#: src/editor-blocks.js:217 -msgid "Event Order" -msgstr "Ereignisreihenfolge" - -#: src/editor-blocks.js:221 -msgid "Dynamic (Newest first while live, chronological after)" -msgstr "Dynamisch (Neueste zuerst während Live-Spiel, chronologisch danach)" - -#: src/editor-blocks.js:222 -msgid "Newest First" -msgstr "Neueste zuerst" - -#: src/editor-blocks.js:223 -msgid "Oldest First" -msgstr "Älteste zuerst" - -#: src/editor-blocks.js:225 -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/editor-blocks.js:229 -msgid "Live events will be displayed on the front-end." -msgstr "" - -#: src/format-shortcode.js:31 -msgid "— Select data point…" -msgstr "" - -#: src/format-shortcode.js:32 -msgid "Match-Typ" -msgstr "" - -#: src/format-shortcode.js:33 -msgid "Liga" -msgstr "" - -#: src/format-shortcode.js:34 -msgid "Gruppe" -msgstr "" - -#: src/format-shortcode.js:35 -msgid "Runde" -msgstr "" - -#: src/format-shortcode.js:36 -msgid "Spielfeld" -msgstr "" - -#: src/format-shortcode.js:37 -msgid "Heimteam" -msgstr "" - -#: src/format-shortcode.js:38 -msgid "Gastteam" -msgstr "" - -#: src/format-shortcode.js:39 -msgid "Tore Heim" -msgstr "" - -#: src/format-shortcode.js:40 -msgid "Tore Gast" -msgstr "" - -#: src/format-shortcode.js:41 -msgid "Tore Halbzeit Heim" -msgstr "" - -#: src/format-shortcode.js:42 -msgid "Tore Halbzeit Gast" -msgstr "" - -#: src/format-shortcode.js:43 -msgid "Spieltag" -msgstr "" - -#: src/format-shortcode.js:44 -msgid "Spielzeit" -msgstr "" - -#: src/format-shortcode.js:45 -msgid "Spielstatus" -msgstr "" - -#: src/format-shortcode.js:46 -msgid "Spiel pausiert" -msgstr "" - -#: src/format-shortcode.js:47 -msgid "Spiel beendet" -msgstr "" - -#: src/format-shortcode.js:52 -msgid "— Select shortcode…" -msgstr "" - -#: 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:356 src/format-shortcode.js:390 -#, 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 "" - -#: 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 "" - -#: src/format-shortcode.js:282 -msgid "Select which match data to display" -msgstr "" - -#: src/format-shortcode.js:289 -msgid "Preview:" -msgstr "" - -#: src/format-shortcode.js:297 -msgid "(no value)" -msgstr "" - -#: src/format-shortcode.js:307 -msgid "Insert Data" -msgstr "" - -#: src/format-shortcode.js:320 -msgid "Shortcode" -msgstr "" - -#: src/format-shortcode.js:324 -msgid "Select a shortcode to insert (logos, etc.)" -msgstr "" - -#: src/format-shortcode.js:331 -msgid "Shortcode:" -msgstr "" - -#: src/format-shortcode.js:341 -msgid "Insert Shortcode" -msgstr "" - -#~ msgid "Display match roster for a selected match and side." -#~ msgstr "" -#~ "Zeigt die Spielerliste für ein ausgewähltes Spiel und eine Mannschaft an." - -#~ msgid "Live match events with optional auto-refresh." -#~ msgstr "Live-Match-Ereignisse mit optionaler Selbstaktualisierung." diff --git a/languages/swi_foot_matchdata-de_DE.mo b/languages/swi_foot_matchdata-de_DE.mo new file mode 100644 index 0000000..3d1dec4 Binary files /dev/null and b/languages/swi_foot_matchdata-de_DE.mo differ 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 f4c4287..8cfa32f 100644 Binary files a/languages/swi_foot_matchdata-en_US.mo and b/languages/swi_foot_matchdata-en_US.mo differ 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 2a649c6..789aff6 100644 Binary files a/languages/swi_foot_matchdata-fr_FR.mo and b/languages/swi_foot_matchdata-fr_FR.mo differ 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 0000000..52fd9bb Binary files /dev/null and b/languages/swi_foot_matchdata-it_IT.mo differ 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() {