Plugin Directory

Changeset 3420396


Ignore:
Timestamp:
12/15/2025 05:26:18 PM (2 months ago)
Author:
spelhubben
Message:

Release 1.8.1: <WordPress naming convention compliance – all global functions and variables now use proper sv_vader_ prefix.>

Location:
spelhubben-weather/trunk
Files:
21 added
23 edited

Legend:

Unmodified
Added
Removed
  • spelhubben-weather/trunk/admin/admin.php

    r3384734 r3420396  
    1818        if ( strpos( $hook, 'sv-vader' ) === false ) {
    1919            return;
     20        }
     21
     22        // Enqueue WP.org plugin showcase
     23        if ( class_exists( 'SV_Vader_WPOrg_Plugins' ) ) {
     24            $wporg = new SV_Vader_WPOrg_Plugins();
     25            $wporg->enqueue_assets( $hook );
    2026        }
    2127
     
    138144        add_settings_field( 'map_default', __( 'Show map by default', 'spelhubben-weather' ), 'sv_vader_field_map_default', 'sv_vader', 'sv_vader_main' );
    139145        add_settings_field( 'map_height', __( 'Map height (px)', 'spelhubben-weather' ), 'sv_vader_field_map_height', 'sv_vader', 'sv_vader_main' );
     146        add_settings_field( 'icon_style', __( 'Icon style', 'spelhubben-weather' ), 'sv_vader_field_icon_style', 'sv_vader', 'sv_vader_main' );
    140147        add_settings_field( 'providers', __( 'Data providers', 'spelhubben-weather' ), 'sv_vader_field_providers', 'sv_vader', 'sv_vader_main' );
    141148        add_settings_field( 'yr_contact', __( 'Yr contact/UA', 'spelhubben-weather' ), 'sv_vader_field_yr_contact', 'sv_vader', 'sv_vader_main' );
     
    218225}
    219226
     227function sv_vader_field_icon_style() {
     228    $o = sv_vader_get_options();
     229    $styles = array(
     230        'classic'          => __( 'Classic', 'spelhubben-weather' ),
     231        'modern-flat'      => __( 'Modern Flat', 'spelhubben-weather' ),
     232        'modern-gradient'  => __( 'Modern Gradient', 'spelhubben-weather' ),
     233    );
     234    echo '<select name="sv_vader_options[icon_style]">';
     235    foreach ( $styles as $val => $label ) {
     236        printf(
     237            '<option value="%s"%s>%s</option>',
     238            esc_attr( $val ),
     239            selected( $o['icon_style'] ?? 'classic', $val, false ),
     240            esc_html( $label )
     241        );
     242    }
     243    echo '</select>';
     244    echo '<p class="description">' . esc_html__( 'Choose your preferred weather icon theme.', 'spelhubben-weather' ) . '</p>';
     245}
     246
    220247function sv_vader_field_providers() {
    221248    $o = sv_vader_get_options();
     
    242269    // NEW: FMI
    243270    printf(
    244         '<label><input type="checkbox" name="sv_vader_options[prov_fmi]" value="1" %s/> %s</label>',
     271        '<label><input type="checkbox" name="sv_vader_options[prov_fmi]" value="1" %s/> %s</label><br>',
    245272        checked( 1, ! empty( $o['prov_fmi'] ), false ),
    246273        esc_html__( 'FMI (Finland, Open Data)', 'spelhubben-weather' )
     274    );
     275    printf(
     276        '<label><input type="checkbox" name="sv_vader_options[prov_openweathermap]" value="1" %s/> %s</label><br>',
     277        checked( 1, ! empty( $o['prov_openweathermap'] ), false ),
     278        esc_html__( 'Open-Weathermap', 'spelhubben-weather' )
     279    );
     280    printf(
     281        '<label><input type="checkbox" name="sv_vader_options[prov_weatherapi]" value="1" %s/> %s</label>',
     282        checked( 1, ! empty( $o['prov_weatherapi'] ), false ),
     283        esc_html__( 'Weatherapi.com', 'spelhubben-weather' )
    247284    );
    248285}
  • spelhubben-weather/trunk/admin/page-settings.php

    r3372751 r3420396  
    9595                </div>
    9696            </div><!-- /.svv-grid -->
     97
     98            <!-- More plugins by Spelhubben -->
     99            <div style="margin-top: 30px; margin-bottom: 20px;">
     100                <?php
     101                if ( class_exists( 'SV_Vader_WPOrg_Plugins' ) ) {
     102                    $wporg = new SV_Vader_WPOrg_Plugins();
     103                    echo wp_kses_post( $wporg->render() );
     104                }
     105                ?>
     106            </div>
    97107        </div><!-- /.wrap -->
    98108        <?php
  • spelhubben-weather/trunk/admin/page-shortcodes.php

    r3384734 r3420396  
    1717        $nx5 = '[spelhubben_weather place="Malmö" show="temp,wind" map="0" units="imperial"]';
    1818
    19         // Legacy (behålls för referens)
    20         $lx1 = '[sv_vader]';
    21         $lx2 = '[sv_vader ort="Göteborg" layout="compact" map="1" animate="1"]';
    22         $lx3 = '[sv_vader lat="57.7089" lon="11.9746" ort="Göteborg" layout="inline" map="0" show="temp,icon"]';
    23         $lx4 = '[sv_vader ort="Umeå" layout="detailed" forecast="daily" days="5" providers="smhi,yr,openmeteo"]';
    24         $lx5 = '[sv_vader ort="Malmö" show="temp,wind" map="0"]';
    25 
    2619        $new_examples = array(
    2720            array( 'label' => __( 'Basic example', 'spelhubben-weather' ), 'code' => $nx1 ),
     
    3023            array( 'label' => __( 'Detailed with daily forecast & km/h', 'spelhubben-weather' ), 'code' => $nx4 ),
    3124            array( 'label' => __( 'Only temperature + wind, imperial', 'spelhubben-weather' ), 'code' => $nx5 ),
    32         );
    33 
    34         $legacy_examples = array(
    35             array( 'label' => __( 'Basic example (legacy)', 'spelhubben-weather' ), 'code' => $lx1 ),
    36             array( 'label' => __( 'Compact with map & animation (legacy)', 'spelhubben-weather' ), 'code' => $lx2 ),
    37             array( 'label' => __( 'Inline without map (legacy)', 'spelhubben-weather' ), 'code' => $lx3 ),
    38             array( 'label' => __( 'Detailed with daily forecast & all providers (legacy)', 'spelhubben-weather' ), 'code' => $lx4 ),
    39             array( 'label' => __( 'Only temperature + wind, no map (legacy)', 'spelhubben-weather' ), 'code' => $lx5 ),
    4025        );
    4126        ?>
     
    7964                                    <div class="svv-codeblock-head">
    8065                                        <span><?php echo esc_html( $ex['label'] ); ?></span>
    81                                         <div class="svv-chiprow">
    82                                             <span class="svv-chip"><?php esc_html_e( 'new', 'spelhubben-weather' ); ?></span>
    83                                             <button type="button" class="button button-secondary svv-copy-btn"
    84                                                     data-copy="<?php echo esc_attr( $ex['code'] ); ?>">
    85                                                 <?php esc_html_e( 'Copy', 'spelhubben-weather' ); ?>
    86                                             </button>
    87                                         </div>
     66                                    <button type="button" class="button button-secondary svv-copy-btn"
     67                                            data-copy="<?php echo esc_attr( $ex['code'] ); ?>">
     68                                        <?php esc_html_e( 'Copy', 'spelhubben-weather' ); ?>
     69                                    </button>
    8870                                    </div>
    8971                                    <pre class="svv-pre"><code tabindex="0"><?php echo esc_html( $ex['code'] ); ?></code></pre>
     
    9274                        </div>
    9375
    94                         <details class="svv-details" style="margin-top:14px;">
    95                             <summary><?php esc_html_e( 'Legacy shortcode examples (deprecated – will be removed soon)', 'spelhubben-weather' ); ?></summary>
    96 
    97                             <div class="svv-codegrid">
    98                                 <?php foreach ( $legacy_examples as $ex ) : ?>
    99                                     <div class="svv-codeblock svv-codeblock--light" data-svv-visible="1"
    100                                          data-label="<?php echo esc_attr( $ex['label'] ); ?>"
    101                                          data-code="<?php echo esc_attr( $ex['code'] ); ?>">
    102                                         <div class="svv-codeblock-head">
    103                                             <span><?php echo esc_html( $ex['label'] ); ?></span>
    104                                             <div class="svv-chiprow">
    105                                                 <span class="svv-chip svv-chip-muted"><?php esc_html_e( 'legacy', 'spelhubben-weather' ); ?></span>
    106                                                 <button type="button" class="button button-secondary svv-copy-btn"
    107                                                         data-copy="<?php echo esc_attr( $ex['code'] ); ?>">
    108                                                     <?php esc_html_e( 'Copy', 'spelhubben-weather' ); ?>
    109                                                 </button>
    110                                             </div>
    111                                         </div>
    112                                         <pre class="svv-pre"><code tabindex="0"><?php echo esc_html( $ex['code'] ); ?></code></pre>
    113                                     </div>
    114                                 <?php endforeach; ?>
    115                             </div>
    116                         </details>
    11776                    </div>
    11877                </div>
  • spelhubben-weather/trunk/assets/map.js

    r3372751 r3420396  
    1414
    1515  // Helpers
    16   function debounce(fn, ms){ let t; return (...a)=>{ clearTimeout(t); t=setTimeout(()=>fn.apply(null,a), ms); }; }
     16  function debounce(fn, ms){
     17    let timeoutId = null;
     18    return function(...args) {
     19      if (timeoutId) clearTimeout(timeoutId);
     20      timeoutId = setTimeout(() => fn.apply(null, args), ms);
     21    };
     22  }
    1723
    1824  // Compute a scale factor based on actual card width
     
    7480      const ro = new ResizeObserver(debounce(applyScale, 60));
    7581      ro.observe(card);
     82     
     83      // Store observer reference for cleanup
     84      card._svvResizeObserver = ro;
    7685    });
    7786  }, 50);
     
    8190  } else { attachRO(); }
    8291
    83   new MutationObserver(attachRO).observe(document.documentElement, { childList:true, subtree: true });
     92  // Single persistent MutationObserver instead of creating new ones
     93  const mutationObserver = new MutationObserver(function(mutations){
     94    // Cleanup removed cards
     95    mutations.forEach(function(m){
     96      if (m.removedNodes.length) {
     97        m.removedNodes.forEach(function(node){
     98          if (node.nodeType === 1) { // Element node
     99            const cards = node.querySelectorAll ? node.querySelectorAll('.sv-vader[data-svv-ro="1"], .spelhubben-weather[data-svv-ro="1"]') : [];
     100            cards.forEach(function(card){
     101              if (card._svvResizeObserver) {
     102                card._svvResizeObserver.disconnect();
     103                delete card._svvResizeObserver;
     104              }
     105              if (card._svvMap) {
     106                card._svvMap.remove();
     107                delete card._svvMap;
     108              }
     109              delete card._svvObserved;
     110            });
     111          }
     112        });
     113      }
     114    });
     115    attachRO();
     116  });
     117 
     118  mutationObserver.observe(document.documentElement, { childList:true, subtree: true });
    84119})();
  • spelhubben-weather/trunk/assets/style.css

    r3372751 r3420396  
    1111  width:100%;
    1212  max-width:100%;
     13  contain: layout style paint;
    1314
    1415  border:1px solid #e6e6e6;
  • spelhubben-weather/trunk/includes/class-plugin.php

    r3372751 r3420396  
    3434
    3535    /**
    36      * Register legacy shortcode and the new alias.
     36     * Register the main shortcode.
    3737     */
    3838    public function register_shortcodes() {
    39         // Legacy shortcode (kept for compatibility)
    40         add_shortcode('sv_vader', [$this, 'render_shortcode_proxy']);
    41 
    42         // New shortcode alias with attribute adapter (English -> legacy Swedish keys)
     39        // Only the new shortcode alias (legacy sv_vader removed in v1.8.0)
    4340        add_shortcode('spelhubben_weather', [$this, 'render_shortcode_alias']);
    44     }
    45 
    46     /**
    47      * Proxy to renderer method for legacy shortcode.
    48      */
    49     public function render_shortcode_proxy($atts = [], $content = null, $tag = '') {
    50         return $this->renderer->render_shortcode($atts, $content, $tag);
    5141    }
    5242
  • spelhubben-weather/trunk/includes/class-renderer.php

    r3384734 r3420396  
    2424                'yr'             => $opts['prov_yr'],
    2525                'metno_nowcast'  => $opts['prov_metno_nowcast'] ?? 0,
    26                 'fmi'            => $opts['prov_fmi'] ?? 0, // NEW
     26                'fmi'            => $opts['prov_fmi'] ?? 0,
     27                'openweathermap' => $opts['prov_openweathermap'] ?? 0,
     28                'weatherapi'     => $opts['prov_weatherapi'] ?? 0,
    2729            ]))),
    2830            'animate'    => '1',
    2931            'forecast'   => 'none',
    3032            'days'       => '5',
     33            'comparison' => '0', // NEW: Show individual provider data
    3134
    3235            // Units & formatting (overrides)
     
    4346
    4447        $provider_list = array_filter(array_map('trim', explode(',', strtolower($a['providers']))));
    45         $allowed = ['openmeteo','smhi','yr','metno_nowcast','fmi']; // NEW
     48        $allowed = ['openmeteo','smhi','yr','metno_nowcast','fmi','openweathermap','weatherapi'];
    4649        $provider_list = array_values(array_intersect($provider_list, $allowed));
    4750        if (empty($provider_list)) $provider_list = ['openmeteo'];
     
    5053
    5154        // Units
    52         $units = svv_resolve_units([
     55        $units = sv_vader_resolve_units([
    5356            'units'        => $a['units'],
    5457            'temp_unit'    => $a['temp_unit'],
     
    5962
    6063        $api = new SV_Vader_API(intval($opts['cache_minutes']));
     64       
     65        // Check if comparison mode is enabled
     66        if ($a['comparison'] === '1') {
     67            $res = $api->get_provider_details($a['ort'], $a['lat'], $a['lon'], $provider_list, $opts['yr_contact']);
     68            if (is_wp_error($res)) return '<em>' . esc_html($res->get_error_message()) . '</em>';
     69            return $this->render_comparison_view($res, $a['ort'], $units, $api);
     70        }
     71       
    6172        $res = $api->get_current_weather($a['ort'], $a['lat'], $a['lon'], $provider_list, $opts['yr_contact']);
    6273        if (is_wp_error($res)) return '<em>' . esc_html($res->get_error_message()) . '</em>';
    6374
    6475        // Convert values according to selected units
    65         list($t_val, $t_sym) = svv_temp($res['temp'] ?? null, $units['temp'], 0);
    66         list($w_val, $w_u)   = svv_wind($res['wind'] ?? null, $units['wind'], 0);
    67         list($p_val, $p_u)   = svv_precip($res['precip'] ?? null, $units['precip'], 1);
     76        list($t_val, $t_sym) = sv_vader_temp($res['temp'] ?? null, $units['temp'], 0);
     77        list($w_val, $w_u)   = sv_vader_wind($res['wind'] ?? null, $units['wind'], 0);
     78        list($p_val, $p_u)   = sv_vader_precip($res['precip'] ?? null, $units['precip'], 1);
    6879        $cloud               = isset($res['cloud']) ? intval($res['cloud']) : null;
    6980
     
    94105                        <?php endif; ?>
    95106                        <?php if (in_array('temp', $show, true) && $t_val !== null): ?>
    96                             <div class="svv-temp"><?php echo esc_html( svv_num($t_val) ); ?><?php echo esc_html($t_sym); ?></div>
     107                        <div class="svv-temp"><?php echo esc_html( sv_vader_num($t_val) ); ?><?php echo esc_html($t_sym); ?></div>
    97108                        <?php endif; ?>
    98109                    </div>
     
    105116                        <?php endif; ?>
    106117                        <?php if (in_array('temp', $show, true) && $t_val !== null): ?>
    107                             <div class="svv-temp"><?php echo esc_html( svv_num($t_val) ); ?><?php echo esc_html($t_sym); ?></div>
     118                            <div class="svv-temp"><?php echo esc_html( sv_vader_num($t_val) ); ?><?php echo esc_html($t_sym); ?></div>
    108119                        <?php endif; ?>
    109120                        <?php if (in_array('wind', $show, true) && $w_val !== null): ?>
    110121                            <?php
    111122                            /* translators: 1: wind value, 2: wind unit (e.g. 5, km/h) */
    112                             $wind_compact = sprintf( __( 'Wind %1$s %2$s', 'spelhubben-weather' ), svv_num($w_val), $w_u );
     123                            $wind_compact = sprintf( __( 'Wind %1$s %2$s', 'spelhubben-weather' ), sv_vader_num($w_val), $w_u );
    113124                            ?>
    114125                            <span class="svv-wind svv-badge"><?php echo esc_html( $wind_compact ); ?></span>
     
    127138                        <div class="svv-col">
    128139                            <?php if (in_array('temp', $show, true) && $t_val !== null): ?>
    129                                 <div class="svv-temp"><?php echo esc_html( svv_num($t_val) ); ?><?php echo esc_html($t_sym); ?></div>
     140                                <div class="svv-temp"><?php echo esc_html( sv_vader_num($t_val) ); ?><?php echo esc_html($t_sym); ?></div>
    130141                            <?php endif; ?>
    131142                            <div class="svv-meta">
     
    133144                                    <?php
    134145                                    /* translators: 1: wind value, 2: wind unit (e.g. 5, km/h) */
    135                                     $wind_detailed = sprintf( __( 'Wind: %1$s %2$s', 'spelhubben-weather' ), svv_num($w_val), $w_u );
     146                                    $wind_detailed = sprintf( __( 'Wind: %1$s %2$s', 'spelhubben-weather' ), sv_vader_num($w_val), $w_u );
    136147                                    ?>
    137148                                    <span class="svv-wind"><?php echo esc_html( $wind_detailed ); ?></span>
     
    145156                                    <?php
    146157                                    /* translators: 1: precipitation value, 2: precipitation unit (e.g. 1.2, mm) */
    147                                     $precip_str = sprintf( __( 'Precipitation: %1$s %2$s', 'spelhubben-weather' ), svv_num($p_val, 1), $p_u );
     158                                    $precip_str = sprintf( __( 'Precipitation: %1$s %2$s', 'spelhubben-weather' ), sv_vader_num($p_val, 1), $p_u );
    148159                                    ?>
    149160                                    <span class="svv-precip"><?php echo esc_html( $precip_str ); ?></span>
     
    152163                                    <?php
    153164                                    /* translators: %s: cloud cover percent (0–100) */
    154                                     $cloud_str = sprintf( __( 'Cloud cover: %s%%', 'spelhubben-weather' ), svv_num($cloud) );
     165                                    $cloud_str = sprintf( __( 'Cloud cover: %s%%', 'spelhubben-weather' ), sv_vader_num($cloud) );
    155166                                    ?>
    156167                                    <span class="svv-cloud"><?php echo esc_html( $cloud_str ); ?></span>
     
    168179                        <?php endif; ?>
    169180                        <?php if (in_array('temp', $show, true) && $t_val !== null): ?>
    170                             <div class="svv-temp"><?php echo esc_html( svv_num($t_val) ); ?><?php echo esc_html($t_sym); ?></div>
     181                            <div class="svv-temp"><?php echo esc_html( sv_vader_num($t_val) ); ?><?php echo esc_html($t_sym); ?></div>
    171182                        <?php endif; ?>
    172183                    </div>
     
    176187                            <?php
    177188                            /* translators: 1: wind value, 2: wind unit (e.g. 5, km/h) */
    178                             $wind_card = sprintf( __( 'Wind: %1$s %2$s', 'spelhubben-weather' ), svv_num($w_val), $w_u );
     189                            $wind_card = sprintf( __( 'Wind: %1$s %2$s', 'spelhubben-weather' ), sv_vader_num($w_val), $w_u );
    179190                            ?>
    180191                            <span class="svv-wind"><?php echo esc_html( $wind_card ); ?></span>
     
    215226                        <div class="svv-daytemps">
    216227                            <?php
    217                             list($fmax,) = svv_temp($d['tmax'], $units['temp'], 0);
    218                             list($fmin,) = svv_temp($d['tmin'], $units['temp'], 0);
     228                            list($fmax,) = sv_vader_temp($d['tmax'], $units['temp'], 0);
     229                            list($fmin,) = sv_vader_temp($d['tmin'], $units['temp'], 0);
    219230                            ?>
    220                             <span class="svv-tmax"><?php echo esc_html( svv_num($fmax) ); ?>°</span>
    221                             <span class="svv-tmin"><?php echo esc_html( svv_num($fmin) ); ?>°</span>
     231                            <span class="svv-tmax"><?php echo esc_html( sv_vader_num($fmax) ); ?>°</span>
     232                            <span class="svv-tmin"><?php echo esc_html( sv_vader_num($fmin) ); ?>°</span>
    222233                        </div>
    223234                        <?php if (!empty($d['desc'])): ?>
     
    232243        return ob_get_clean();
    233244    }
     245
     246    /**
     247     * Render comparison view showing all providers' data side-by-side
     248     */
     249    private function render_comparison_view($res, $place, $units, $api) {
     250        $name = $res['name'] ?? $place;
     251        $lat = $res['lat'];
     252        $lon = $res['lon'];
     253        $providers = $res['providers'] ?? [];
     254
     255        // Map provider names to display names
     256        $display_names = [
     257            'openmeteo'      => 'Open-Meteo',
     258            'smhi'           => 'SMHI',
     259            'yr'             => 'Yr (MET Norway)',
     260            'fmi'            => 'FMI (Finland)',
     261            'openweathermap' => 'Open-Weathermap',
     262            'weatherapi'     => 'Weatherapi.com',
     263        ];
     264
     265        ob_start(); ?>
     266        <div class="sv-vader spelhubben-weather svv-comparison">
     267            <div class="svv-ort"><?php echo esc_html($name); ?></div>
     268            <p class="svv-comparison-subtitle" style="text-align:center; margin:10px 0; font-size:13px; color:#666;">
     269                <?php esc_html_e('Provider Comparison', 'spelhubben-weather'); ?> (<?php echo count($providers); ?> <?php esc_html_e('sources', 'spelhubben-weather'); ?>)
     270            </p>
     271
     272            <div class="svv-comparison-grid" style="display:grid; grid-template-columns:repeat(auto-fit, minmax(240px, 1fr)); gap:12px; margin:12px 0;">
     273                <?php foreach ($providers as $provider_key => $data): ?>
     274                    <?php
     275                    $display_name = $display_names[$provider_key] ?? ucfirst($provider_key);
     276                   
     277                    // Convert values
     278                    list($t_val, $t_sym) = sv_vader_temp($data['temp'] ?? null, $units['temp'], 0);
     279                    list($w_val, $w_u)   = sv_vader_wind($data['wind'] ?? null, $units['wind'], 0);
     280                    list($p_val, $p_u)   = sv_vader_precip($data['precip'] ?? null, $units['precip'], 1);
     281                    $cloud = isset($data['cloud']) ? intval($data['cloud']) : null;
     282                    $desc = $data['desc'] ?? '—';
     283                    ?>
     284                    <div class="svv-provider-card" style="border:1px solid #ddd; border-radius:6px; padding:12px; background:#fafafa;">
     285                        <div style="font-weight:600; margin-bottom:8px; color:#333;"><?php echo esc_html($display_name); ?></div>
     286                       
     287                        <div style="font-size:18px; font-weight:bold; color:#2c3e50; margin-bottom:6px;">
     288                            <?php if ($t_val !== null): ?>
     289                            <?php echo esc_html(sv_vader_num($t_val)); ?><?php echo esc_html($t_sym); ?>
     290                        <?php else: ?>
     291                            <span style="color:#999;">—</span>
     292                        <?php endif; ?>
     293                    </div>
     294
     295                    <div style="font-size:12px; color:#666; margin-bottom:8px;">
     296                        <?php if ($w_val !== null): ?>
     297                            <div>💨 Wind: <?php echo esc_html(sv_vader_num($w_val)); ?> <?php echo esc_html($w_u); ?></div>
     298                        <?php endif; ?>
     299                        <?php if ($p_val !== null): ?>
     300                            <div>💧 Precip: <?php echo esc_html(sv_vader_num($p_val, 1)); ?> <?php echo esc_html($p_u); ?></div>
     301                            <?php endif; ?>
     302                            <?php if ($cloud !== null): ?>
     303                                <div>☁️ Cloud: <?php echo esc_html($cloud); ?>%</div>
     304                            <?php endif; ?>
     305                        </div>
     306
     307                        <?php if (!empty($desc) && $desc !== '—'): ?>
     308                            <div style="font-size:12px; font-style:italic; color:#555; padding-top:6px; border-top:1px solid #e0e0e0;">
     309                                <?php echo esc_html($desc); ?>
     310                            </div>
     311                        <?php endif; ?>
     312                    </div>
     313                <?php endforeach; ?>
     314            </div>
     315
     316            <div style="margin-top:16px; padding:8px; background:#f0f0f0; border-radius:4px; font-size:12px; color:#666;">
     317                <strong><?php esc_html_e('Note:', 'spelhubben-weather'); ?></strong>
     318                <?php esc_html_e('Each provider may report different values due to different measuring stations or calculation methods. Use this view to compare accuracy and availability.', 'spelhubben-weather'); ?>
     319            </div>
     320        </div>
     321        <?php
     322        return ob_get_clean();
     323    }
    234324}
    235325}
  • spelhubben-weather/trunk/includes/class-sv-vader.php

    r3384734 r3420396  
    3838
    3939        if (in_array('openmeteo', $providers, true)) {
    40             $om = svp_openmeteo_current($lat, $lon, $api_lang);
     40            $om = sv_vader_openmeteo_current($lat, $lon, $api_lang);
    4141            if ($om) $samples[] = $om;
    4242        }
    4343        if (in_array('smhi', $providers, true)) {
    44             $sm = svp_smhi_current($lat, $lon);
     44            $sm = sv_vader_smhi_current($lat, $lon);
    4545            if ($sm) $samples[] = $sm;
    4646        }
    4747        if (in_array('yr', $providers, true)) {
    48             $yr = svp_yr_current($lat, $lon, $yr_contact);
     48            $yr = sv_vader_yr_current($lat, $lon, $yr_contact);
    4949            if ($yr) $samples[] = $yr;
    5050        }
    51         // NEW: FMI
    5251        if (in_array('fmi', $providers, true)) {
    53             $fmi = svp_fmi_current($lat, $lon);
     52            $fmi = sv_vader_fmi_current($lat, $lon);
    5453            if ($fmi) $samples[] = $fmi;
    5554        }
     55        if (in_array('openweathermap', $providers, true)) {
     56            $owm = sv_vader_openweathermap_current($lat, $lon, $api_lang);
     57            if ($owm) $samples[] = $owm;
     58        }
     59        if (in_array('weatherapi', $providers, true)) {
     60            $wa = sv_vader_weatherapi_current($lat, $lon, $api_lang);
     61            if ($wa) $samples[] = $wa;
     62        }
    5663
    5764        if (empty($samples)) {
     
    5966        }
    6067
    61         $cons = svp_consensus($samples);
     68        $cons = sv_vader_consensus($samples);
    6269
    6370        $out = array_merge([
     
    7178    }
    7279
     80    /**
     81     * Get individual provider data (for comparison/debugging)
     82     */
     83    public function get_provider_details($ort = '', $lat = '', $lon = '', $providers = [], $yr_contact = '') {
     84        $ort = trim((string)$ort);
     85        $lat = trim((string)$lat);
     86        $lon = trim((string)$lon);
     87
     88        $api_lang = sv_vader_api_lang();
     89        $salt     = sv_vader_cache_salt();
     90
     91        $cache_key = 'sv_vader_details_' . md5(json_encode([$ort,$lat,$lon,$providers,$api_lang,$salt]));
     92        $cached = get_transient($cache_key);
     93        if ($cached !== false) return $cached;
     94
     95        if ($lat === '' || $lon === '') {
     96            $coords = $this->geocode($ort);
     97            if (is_wp_error($coords)) return $coords;
     98            $lat  = $coords['lat'];
     99            $lon  = $coords['lon'];
     100            $name = $coords['name'];
     101        } else {
     102            $name = $ort;
     103        }
     104
     105        $details = [];
     106
     107        if (in_array('openmeteo', $providers, true)) {
     108            $om = sv_vader_openmeteo_current($lat, $lon, $api_lang);
     109            if ($om) $details['openmeteo'] = $om;
     110        }
     111        if (in_array('smhi', $providers, true)) {
     112            $sm = sv_vader_smhi_current($lat, $lon);
     113            if ($sm) $details['smhi'] = $sm;
     114        }
     115        if (in_array('yr', $providers, true)) {
     116            $yr = sv_vader_yr_current($lat, $lon, $yr_contact);
     117            if ($yr) $details['yr'] = $yr;
     118        }
     119        if (in_array('fmi', $providers, true)) {
     120            $fmi = sv_vader_fmi_current($lat, $lon);
     121            if ($fmi) $details['fmi'] = $fmi;
     122        }
     123        if (in_array('openweathermap', $providers, true)) {
     124            $owm = sv_vader_openweathermap_current($lat, $lon, $api_lang);
     125            if ($owm) $details['openweathermap'] = $owm;
     126        }
     127        if (in_array('weatherapi', $providers, true)) {
     128            $wa = sv_vader_weatherapi_current($lat, $lon, $api_lang);
     129            if ($wa) $details['weatherapi'] = $wa;
     130        }
     131
     132        $out = [
     133            'name' => $name ?: $ort,
     134            'lat'  => $lat,
     135            'lon'  => $lon,
     136            'providers' => $details,
     137        ];
     138
     139        set_transient($cache_key, $out, MINUTE_IN_SECONDS * $this->cache_minutes);
     140        return $out;
     141    }
     142
    73143    public function get_daily_forecast($ort = '', $lat = '', $lon = '', $days = 5) {
    74144        $ort  = trim((string)$ort);
     
    91161        }
    92162
    93         $list = svp_openmeteo_daily($lat, $lon, $days, $api_lang);
     163        $list = sv_vader_openmeteo_daily($lat, $lon, $days, $api_lang);
    94164        set_transient($cache_key, $list, MINUTE_IN_SECONDS * $this->cache_minutes);
    95165        return $list;
     
    97167
    98168    private function geocode($q) {
     169        $salt = sv_vader_cache_salt();
     170        $geocode_cache_key = 'sv_vader_geocode_' . md5($q . $salt);
     171       
     172        // Check cache first
     173        $cached = get_transient($geocode_cache_key);
     174        if ($cached !== false) return $cached;
     175
    99176        $url = add_query_arg([
    100177            'name'     => $q,
     
    113190
    114191        $r = $data['results'][0];
    115         return [
     192        $result = [
    116193            'lat'  => (string)$r['latitude'],
    117194            'lon'  => (string)$r['longitude'],
    118195            'name' => trim(($r['name'] ?? '') . (isset($r['country_code']) ? ', ' . $r['country_code'] : ''))
    119196        ];
     197       
     198        // Cache geocoding result for 7 days
     199        set_transient($geocode_cache_key, $result, DAY_IN_SECONDS * 7);
     200        return $result;
    120201    }
    121202
     
    123204        if ($code === null) return '';
    124205        $type = 'cloud';
     206        // Clear sky
    125207        if (in_array($code, [0,1], true)) { $type = 'sun';
    126         } elseif (in_array($code, [2,3,45,48], true)) { $type = 'cloud';
    127         } elseif (in_array($code, [51,53,55,61,63,65,80,81,82,66,67], true)) { $type = 'rain';
     208        // Mostly cloudy
     209        } elseif (in_array($code, [2], true)) { $type = 'partly-cloudy';
     210        // Overcast
     211        } elseif (in_array($code, [3,45,48], true)) { $type = 'cloud';
     212        // Fog/Mist
     213        } elseif (in_array($code, [45,48], true)) { $type = 'fog';
     214        // Drizzle (light rain)
     215        } elseif (in_array($code, [51,53,55], true)) { $type = 'rain';
     216        // Rain
     217        } elseif (in_array($code, [61,63,65,80,81,82], true)) { $type = 'rain';
     218        // Sleet (rain+snow mix)
     219        } elseif (in_array($code, [66,67], true)) { $type = 'sleet';
     220        // Snow
    128221        } elseif (in_array($code, [71,73,75,77,85,86], true)) { $type = 'snow';
     222        // Thunderstorm
    129223        } elseif (in_array($code, [95,96,99], true)) { $type = 'storm'; }
    130224
     225        return $this->build_icon_url($type);
     226    }
     227
     228    private function build_icon_url($type) {
     229        // Get icon style from options (cached at renderer level, but safe here too)
     230        static $style = null;
     231        if ($style === null) {
     232            $opts = sv_vader_get_options();
     233            $style = $opts['icon_style'] ?? 'classic';
     234        }
     235
     236        // Try modern style first if selected
     237        if ($style !== 'classic') {
     238            $modern_rel  = 'assets/icons/' . $style . '-' . $type . '.svg';
     239            $modern_path = trailingslashit(SV_VADER_DIR) . $modern_rel;
     240            $modern_url  = trailingslashit(SV_VADER_URL) . $modern_rel;
     241            if (file_exists($modern_path)) return $modern_url;
     242        }
     243
     244        // Fallback to classic style
    131245        $rel  = 'assets/icons/' . $type . '.svg';
    132246        $path = trailingslashit(SV_VADER_DIR) . $rel;
     
    138252
    139253    private function svg_data_uri($type) {
    140         // (unchanged inline SVGs)
     254        // Fallback inline SVG data URIs for icon types
    141255        $svg = '';
    142256        if ($type === 'sun') {
    143257            $svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g fill="#111"><circle cx="32" cy="32" r="12"/><g opacity=".9"><rect x="31" y="2" width="2" height="10"/><rect x="31" y="52" width="2" height="10"/><rect x="2" y="31" width="10" height="2"/><rect x="52" y="31" width="10" height="2"/><rect x="10.3" y="10.3" width="2" height="10" transform="rotate(-45 11.3 15.3)"/><rect x="51.7" y="43.7" width="2" height="10" transform="rotate(-45 52.7 48.7)"/><rect x="43.7" y="10.3" width="10" height="2" transform="rotate(45 48.7 11.3)"/><rect x="10.3" y="51.7" width="10" height="2" transform="rotate(45 15.3 52.7)"/></g></g></svg>';
     258        } elseif ($type === 'partly-cloudy') {
     259            $svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g fill="#111"><circle cx="20" cy="24" r="6"/><g opacity=".7"><rect x="19" y="8" width="2" height="8"/><rect x="19" y="40" width="2" height="8"/><rect x="4" y="23" width="8" height="2"/><rect x="32" y="23" width="8" height="2"/><rect x="9.2" y="13.2" width="2" height="8" transform="rotate(-45 10.2 17.2)"/><rect x="27.8" y="31.8" width="2" height="8" transform="rotate(-45 28.8 35.8)"/><rect x="27.8" y="13.2" width="8" height="2" transform="rotate(45 31.8 14.2)"/><rect x="9.2" y="31.8" width="8" height="2" transform="rotate(45 13.2 32.8)"/></g></g><path fill="#111" d="M30 44h20a8 8 0 0 0 0-16 11 11 0 0 0-21.6-3A10 10 0 0 0 30 44z" opacity=".8"/></svg>';
    144260        } elseif ($type === 'cloud') {
    145261            $svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#111" d="M22 48h24a10 10 0 0 0 0-20 14 14 0 0 0-27.3-3.8A12 12 0 0 0 22 48z"/></svg>';
     262        } elseif ($type === 'fog') {
     263            $svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#111" d="M22 40h24a10 10 0 0 0 0-20 14 14 0 0 0-27.3-3.8A12 12 0 0 0 22 40z"/><g stroke="#111" stroke-width="1.5" stroke-linecap="round" opacity=".6"><line x1="20" y1="44" x2="40" y2="44"/><line x1="18" y1="48" x2="42" y2="48"/><line x1="20" y1="52" x2="40" y2="52"/></g></svg>';
    146264        } elseif ($type === 'rain') {
    147265            $svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#111" d="M22 40h24a10 10 0 0 0 0-20 14 14 0 0 0-27.3-3.8A12 12 0 0 0 22 40z"/><g fill="#111" opacity=".9"><path d="M22 46l-2 6"/><path d="M30 46l-2 6"/><path d="M38 46l-2 6"/><path d="M46 46l-2 6"/></g></svg>';
     266        } elseif ($type === 'sleet') {
     267            $svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#111" d="M22 40h24a10 10 0 0 0 0-20 14 14 0 0 0-27.3-3.8A12 12 0 0 0 22 40z"/><g opacity=".8"><circle cx="26" cy="50" r="1.5" fill="#111"/><path d="M34 46l-2 6" stroke="#111" stroke-width="1.5" fill="none" stroke-linecap="round"/><circle cx="42" cy="50" r="1.5" fill="#111"/><path d="M46 48l-2 6" stroke="#111" stroke-width="1.5" fill="none" stroke-linecap="round"/></g></svg>';
    148268        } elseif ($type === 'snow') {
    149269            $svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#111" d="M22 40h24a10 10 0 0 0 0-20 14 14 0 0 0-27.3-3.8A12 12 0 0 0 22 40z"/><g fill="#111" opacity=".9"><circle cx="24" cy="48" r="2"/><circle cx="32" cy="48" r="2"/><circle cx="40" cy="48" r="2"/></g></svg>';
     270        } elseif ($type === 'hail') {
     271            $svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#111" d="M22 40h24a10 10 0 0 0 0-20 14 14 0 0 0-27.3-3.8A12 12 0 0 0 22 40z"/><g fill="#111" opacity=".8"><circle cx="26" cy="48" r="1.8"/><circle cx="34" cy="50" r="1.8"/><circle cx="42" cy="48" r="1.8"/><circle cx="50" cy="50" r="1.8"/><circle cx="30" cy="54" r="1.5"/><circle cx="46" cy="54" r="1.5"/></g></svg>';
    150272        } else {
     273            // Storm (thunderbolt)
    151274            $svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#111" d="M22 40h24a10 10 0 0 0 0-20 14 14 0 0 0-27.3-3.8A12 12 0 0 0 22 40z"/><path fill="#111" d="M32 42l-6 12h6l-2 8 8-14h-6l2-6z"/></svg>';
    152275        }
  • spelhubben-weather/trunk/includes/format.php

    r3372751 r3420396  
    1010 *  - imperial    => F,  mph, in
    1111 */
    12 if (!function_exists('svv_resolve_units')) {
    13     function svv_resolve_units(array $in): array {
     12if (!function_exists('sv_vader_resolve_units')) {
     13    function sv_vader_resolve_units(array $in): array {
    1414        $preset = strtolower($in['units'] ?? '');
    1515        $map = [
     
    3434}
    3535
    36 if (!function_exists('svv_temp')) {
    37     function svv_temp(?float $celsius, string $unit, int $dec = 0): array {
     36if (!function_exists('sv_vader_temp')) {
     37    function sv_vader_temp(?float $celsius, string $unit, int $dec = 0): array {
    3838        if ($celsius === null) return [null, $unit === 'F' ? '°F' : '°C'];
    3939        if ($unit === 'F') {
     
    4545}
    4646
    47 if (!function_exists('svv_wind')) {
    48     function svv_wind(?float $ms, string $unit, int $dec = 0): array {
     47if (!function_exists('sv_vader_wind')) {
     48    function sv_vader_wind(?float $ms, string $unit, int $dec = 0): array {
    4949        if ($ms === null) return [null, $unit];
    5050        switch ($unit) {
     
    5757}
    5858
    59 if (!function_exists('svv_precip')) {
    60     function svv_precip(?float $mm, string $unit, int $dec = 1): array {
     59if (!function_exists('sv_vader_precip')) {
     60    function sv_vader_precip(?float $mm, string $unit, int $dec = 1): array {
    6161        if ($mm === null) return [null, $unit];
    6262        if ($unit === 'in') {
     
    6868}
    6969
    70 if (!function_exists('svv_num')) {
    71     function svv_num($v, int $decimals = 0) {
     70if (!function_exists('sv_vader_num')) {
     71    function sv_vader_num($v, int $decimals = 0) {
    7272        if ($v === null || $v === '') return '';
    7373        return number_format_i18n($v, $decimals);
  • spelhubben-weather/trunk/includes/options.php

    r3384734 r3420396  
    1515            'map_default'    => 1,
    1616            'map_height'     => 240,
     17            'icon_style'     => 'classic',  // classic | modern-flat | modern-gradient
    1718
    1819            // Data providers
     
    2122            'prov_yr'            => 1,
    2223            'prov_metno_nowcast' => 1,
    23             'prov_fmi'           => 1, // NEW
    24 
    25             'yr_contact'         => '[email protected]',
    26 
    27             // NEW: Units & formatting
    28             'units'        => 'metric', // metric | metric_kmh | imperial
     24        'prov_fmi'           => 1,
     25        'prov_openweathermap' => 1,
     26        'prov_weatherapi'     => 1,
    2927            'temp_unit'    => '',       // optional override: C|F
    3028            'wind_unit'    => '',       // optional override: ms|kmh|mph
     
    7270        $out['prov_yr']            = !empty($in['prov_yr']) ? 1 : 0;
    7371        $out['prov_metno_nowcast'] = !empty($in['prov_metno_nowcast']) ? 1 : 0;
    74         $out['prov_fmi']           = !empty($in['prov_fmi']) ? 1 : 0;
     72        $out['prov_fmi']           = !empty($in['prov_fmi']) ? 1 : 0;
     73        $out['prov_openweathermap'] = !empty($in['prov_openweathermap']) ? 1 : 0;
     74        $out['prov_weatherapi']     = !empty($in['prov_weatherapi']) ? 1 : 0;
     75
     76        // Icon style preference
     77        $allowed_icon_styles = ['classic','modern-flat','modern-gradient'];
     78        $icon_style_in = strtolower((string)($in['icon_style'] ?? $def['icon_style'] ?? 'classic'));
     79        $out['icon_style'] = in_array($icon_style_in, $allowed_icon_styles, true) ? $icon_style_in : 'classic';
    7580
    7681        $out['yr_contact'] = sanitize_text_field($in['yr_contact'] ?? $def['yr_contact']);
  • spelhubben-weather/trunk/includes/providers.php

    r3384734 r3420396  
    33if (!defined('ABSPATH')) exit;
    44
    5 if (!function_exists('svp_openmeteo_current')) {
    6     function svp_openmeteo_current($lat, $lon, $locale = 'en') {
     5if (!function_exists('sv_vader_openmeteo_current')) {
     6    function sv_vader_openmeteo_current($lat, $lon, $locale = 'en') {
    77        $url = add_query_arg([
    88            'latitude'  => $lat,
     
    3030}
    3131
    32 if (!function_exists('svp_smhi_current')) {
    33     function svp_smhi_current($lat, $lon) {
     32if (!function_exists('sv_vader_smhi_current')) {
     33    function sv_vader_smhi_current($lat, $lon) {
    3434        $url = sprintf(
    3535            'https://opendata.smhi.se/meteorological/forecast/api/category/pmp3g/version/2/geotype/point/lon/%s/lat/%s/data.json',
     
    7272}
    7373
    74 if (!function_exists('svp_yr_current')) {
    75     function svp_yr_current($lat, $lon, $contactUA = '') {
     74if (!function_exists('sv_vader_yr_current')) {
     75    function sv_vader_yr_current($lat, $lon, $contactUA = '') {
    7676        $ua = 'Spelhubben-Weather/1.0';
    7777        if ($contactUA) $ua .= ' (' . $contactUA . ')';
     
    116116 *  - t2m (°C), ws_10min (m/s), r_1h (mm), n_man (cloud oktas 0..8)
    117117 */
    118 if (!function_exists('svp_fmi_current')) {
    119     function svp_fmi_current($lat, $lon) {
     118if (!function_exists('sv_vader_fmi_current')) {
     119    function sv_vader_fmi_current($lat, $lon) {
    120120        $lat = floatval($lat); $lon = floatval($lon);
    121121        if (!$lat && !$lon) return null;
     
    139139        if (!is_string($xml) || $xml==='') return null;
    140140
    141         $sx = @simplexml_load_string($xml);
     141        // Safely load XML with LIBXML_NOCDATA to avoid entity expansion attacks
     142        $old_errors = libxml_use_internal_errors(true);
     143        $sx = simplexml_load_string($xml, null, LIBXML_NOCDATA);
     144        libxml_use_internal_errors($old_errors);
     145       
    142146        if (!$sx) return null;
    143147        $sx->registerXPathNamespace('wml2','http://www.opengis.net/waterml/2.0');
     
    167171}
    168172
     173if (!function_exists('sv_vader_openweathermap_current')) {
     174    function sv_vader_openweathermap_current($lat, $lon, $locale = 'en') {
     175        // Open-Weathermap free tier (no API key required for basic requests)
     176        $url = add_query_arg([
     177            'lat'   => $lat,
     178            'lon'   => $lon,
     179            'units' => 'metric',
     180            'lang'  => $locale
     181        ], 'https://api.openweathermap.org/data/2.5/weather');
     182
     183        $res = wp_remote_get($url, ['timeout' => 10]);
     184        if (is_wp_error($res) || wp_remote_retrieve_response_code($res) !== 200) return null;
     185        $j = json_decode(wp_remote_retrieve_body($res), true);
     186        if (empty($j['main'])) return null;
     187
     188        $main = $j['main'];
     189        $wind = !empty($j['wind']) ? $j['wind'] : [];
     190        $clouds = !empty($j['clouds']) ? $j['clouds'] : [];
     191        $rain = !empty($j['rain']) ? $j['rain'] : [];
     192
     193        return [
     194            'temp'   => isset($main['temp']) ? floatval($main['temp']) : null,
     195            'wind'   => isset($wind['speed']) ? floatval($wind['speed']) : null,
     196            'precip' => isset($rain['1h']) ? floatval($rain['1h']) : null,
     197            'cloud'  => isset($clouds['all']) ? intval($clouds['all']) : null,
     198            'code'   => null,
     199            'desc'   => !empty($j['weather'][0]['main']) ? sanitize_text_field($j['weather'][0]['main']) : null,
     200        ];
     201    }
     202}
     203
     204if (!function_exists('sv_vader_weatherapi_current')) {
     205    function sv_vader_weatherapi_current($lat, $lon, $locale = 'en') {
     206        // Weatherapi.com free tier (no API key required)
     207        $lang_map = [
     208            'sv' => 'sv',
     209            'nb' => 'no',
     210            'en' => 'en',
     211            'de' => 'de',
     212            'fr' => 'fr',
     213            'es' => 'es',
     214        ];
     215        $api_lang = $lang_map[substr($locale, 0, 2)] ?? 'en';
     216
     217        $url = add_query_arg([
     218            'q'     => "$lat,$lon",
     219            'lang'  => $api_lang,
     220            'aqi'   => 'no',
     221        ], 'https://api.weatherapi.com/v1/current.json');
     222
     223        $res = wp_remote_get($url, ['timeout' => 10]);
     224        if (is_wp_error($res) || wp_remote_retrieve_response_code($res) !== 200) return null;
     225        $j = json_decode(wp_remote_retrieve_body($res), true);
     226        if (empty($j['current'])) return null;
     227
     228        $current = $j['current'];
     229        return [
     230            'temp'   => isset($current['temp_c']) ? floatval($current['temp_c']) : null,
     231            'wind'   => isset($current['wind_kph']) ? floatval($current['wind_kph'] / 3.6) : null, // Convert km/h to m/s
     232            'precip' => isset($current['precip_mm']) ? floatval($current['precip_mm']) : null,
     233            'cloud'  => isset($current['cloud']) ? intval($current['cloud']) : null,
     234            'code'   => null,
     235            'desc'   => !empty($current['condition']['text']) ? sanitize_text_field($current['condition']['text']) : null,
     236        ];
     237    }
     238}
     239
    169240/**
    170241 * WMO code → English text (base language). Wrapped in i18n for translation.
    171242 */
    172 if (!function_exists('svp_wmo_text')) {
    173     function svp_wmo_text($code) {
     243if (!function_exists('sv_vader_wmo_text')) {
     244    function sv_vader_wmo_text($code) {
    174245        // Translators: weather description from WMO code.
    175246        $map = [
     
    206277
    207278// Back-compat: old Swedish helper (now defers to English/i18n version)
    208 if (!function_exists('svp_wmo_text_sv')) {
    209     function svp_wmo_text_sv($code) {
    210         return svp_wmo_text($code);
    211     }
    212 }
    213 
    214 if (!function_exists('svp_consensus')) {
    215     function svp_consensus(array $samples) {
     279if (!function_exists('sv_vader_wmo_text_sv')) {
     280    function sv_vader_wmo_text_sv($code) {
     281        return sv_vader_wmo_text($code);
     282    }
     283}
     284
     285if (!function_exists('sv_vader_consensus')) {
     286    function sv_vader_consensus(array $samples) {
    216287        $nums = ['temp','wind','precip','cloud'];
    217288        $out = [];
     
    236307        if ($om !== null) {
    237308            $out['code'] = $om;
    238             $out['desc'] = svp_wmo_text($om);
     309            $out['desc'] = sv_vader_wmo_text($om);
    239310        } else {
    240311            $cloud = $out['cloud'];
     
    259330}
    260331
    261 if (!function_exists('svp_openmeteo_daily')) {
     332if (!function_exists('sv_vader_openmeteo_daily')) {
    262333    /**
    263334     * Fetch daily forecast (max/min, WMO code) for N days (3..10).
    264335     * Returns: [ ['date'=>'YYYY-MM-DD','tmax'=>..,'tmin'=>..,'code'=>int|null,'desc'=>string], ... ]
    265336     */
    266     function svp_openmeteo_daily($lat, $lon, $days = 5, $locale = 'en') {
     337    function sv_vader_openmeteo_daily($lat, $lon, $days = 5, $locale = 'en') {
    267338        $days = max(3, min(10, intval($days)));
    268339        $url = add_query_arg([
     
    292363                    'tmin' => isset($tmin[$i]) ? round(floatval($tmin[$i])) : null,
    293364                    'code' => $code,
    294                     'desc' => ($code !== null) ? svp_wmo_text($code) : ''
     365                    'desc' => ($code !== null) ? sv_vader_wmo_text($code) : ''
    295366                ];
    296367            }
  • spelhubben-weather/trunk/languages/spelhubben-weather-nb_NO-ef457c6fc9879530ccb874bec7a8e544.json

    r3372751 r3420396  
    1 {"translation-revision-date": "2025-10-04 09:53+0200", "generator": "Poedit 3.7", "source": "blocks/spelhubben-weather/index.js", "domain": "messages", "locale_data": {"messages": {"": {"domain": "messages", "lang": "no", "plural-forms": "nplurals=2; plural=(n != 1);"}, "Map height (px)": ["Karth\u00f8yde (px)"], "Units & format": ["Enheter og format"], "Preset": ["Forh\u00e5ndsinnstilt"], "e.g. Stockholm": ["f.eks. Oslo"], "Metric (\u00b0C, m/s, mm)": ["Metrisk (\u00b0C, m/s, mm)"], "Metric (\u00b0C, km/h, mm)": ["Metrisk (\u00b0C, km/t, mm)"], "Imperial (\u00b0F, mph, in)": ["Imperial (\u00b0F, mph, in)"], "Forecast": ["Prognose"], "Location": ["Lokasjon"], "Display": ["Fremvisning"], "Inline": ["Inline"], "Compact": ["Kompakt"], "Card": ["Kort"], "Detailed": ["Detaljert"], "Place (name)": ["Sted (navn)"], "Coordinates override place when set.": ["Koordinater overstyrer sted n\u00e5r de er angitt."], "Layout": ["Oppsett"], "Fields (comma-separated)": ["Felt (kommaseparert)"], "Show map": ["Vis kart"], "Animations": ["Animasjoner"], "Date format (PHP date)": ["Datoformat (PHP-dato)"], "Used for forecast labels (default: D j/n)": ["Brukes for prognoseetiketter (standard: D j/n)"], "Type": ["Type"], "None": ["Ingen"], "Daily": ["Daglig"], "Days": ["Dager"], "Spelhubben Weather preview (ServerSideRender unavailable). Save/update to view.": ["Forh\u00e5ndsvisning av Spelhubben-v\u00e6r (ServerSideRender utilgjengelig). Lagre/oppdater for visning."]}}}
     1{"translation-revision-date": "2025-12-15 18:19+0100", "generator": "Poedit 3.8", "source": "blocks/spelhubben-weather/index.js", "domain": "messages", "locale_data": {"messages": {"": {"domain": "messages", "lang": "no", "plural-forms": "nplurals=2; plural=(n != 1);"}, "Map height (px)": ["Karth\u00f8yde (px)"], "Units & format": ["Enheter og format"], "Preset": ["Forh\u00e5ndsinnstilt"], "e.g. Stockholm": ["f.eks. Oslo"], "Metric (\u00b0C, m/s, mm)": ["Metrisk (\u00b0C, m/s, mm)"], "Metric (\u00b0C, km/h, mm)": ["Metrisk (\u00b0C, km/t, mm)"], "Imperial (\u00b0F, mph, in)": ["Imperial (\u00b0F, mph, in)"], "Forecast": ["Prognose"], "Location": ["Lokasjon"], "Display": ["Fremvisning"], "Inline": ["Inline"], "Compact": ["Kompakt"], "Card": ["Kort"], "Detailed": ["Detaljert"], "Place (name)": ["Sted (navn)"], "Coordinates override place when set.": ["Koordinater overstyrer sted n\u00e5r de er angitt."], "Layout": ["Oppsett"], "Fields (comma-separated)": ["Felt (kommaseparert)"], "Show map": ["Vis kart"], "Animations": ["Animasjoner"], "Date format (PHP date)": ["Datoformat (PHP-dato)"], "Used for forecast labels (default: D j/n)": ["Brukes for prognoseetiketter (standard: D j/n)"], "Type": ["Type"], "None": ["Ingen"], "Daily": ["Daglig"], "Days": ["Dager"], "Spelhubben Weather preview (ServerSideRender unavailable). Save/update to view.": ["Forh\u00e5ndsvisning av Spelhubben-v\u00e6r (ServerSideRender utilgjengelig). Lagre/oppdater for visning."]}}}
  • spelhubben-weather/trunk/languages/spelhubben-weather-nb_NO.l10n.php

    r3372751 r3420396  
    11<?php
    22// generated by Poedit from spelhubben-weather-nb_NO.po, do not edit directly
    3 return ['domain'=>NULL,'plural-forms'=>'nplurals=2; plural=(n != 1);','language'=>'no','pot-creation-date'=>'2025-10-04 09:32+0200','po-revision-date'=>'2025-10-04 09:53+0200','translation-revision-date'=>'2025-10-04 09:53+0200','project-id-version'=>'Spelhubben Weather','x-generator'=>'Poedit 3.7','messages'=>['Copied!'=>'Kopiert!','Copy'=>'Kopier','Expand'=>'Utvid','Collapse'=>'Slå sammen','Rendering…'=>'Gjengivelse…','OK'=>'OK','Failed'=>'Mislyktes','Preview failed'=>'Forhåndsvisning mislyktes','Spelhubben Weather'=>'Spelhubben Været','Settings'=>'Innstillinger','Shortcodes'=>'Kortkode','Default settings'=>'Standardinnstillinger','Default place'=>'Standardsted','Cache TTL (minutes)'=>'Cache-TTL (minutter)','Default fields'=>'Standardfelt','Default layout'=>'Standardoppsett','Show map by default'=>'Vis kart som standard','Map height (px)'=>'Karthøyde (px)','Data providers'=>'Dataleverandører','Yr contact/UA'=>'Yr kontakt/UA','Units & format'=>'Enheter og format','Preset'=>'Forhåndsinnstilt','Overrides (optional)'=>'Overstyringer (valgfritt)','Date format (PHP)'=>'Datoformat (PHP)','e.g. Stockholm'=>'f.eks. Oslo','How long weather data is cached (transients).'=>'Hvor lenge værdata lagres i mellomlagring (transienter).','Comma-separated: temp,wind,icon'=>'Kommaseparert: temp, vind, ikon','layout label' . "\4" . 'Inline'=>'Innebygd','layout label' . "\4" . 'Compact'=>'Kompakt','layout label' . "\4" . 'Card'=>'Kort','layout label' . "\4" . 'Detailed'=>'Detaljert','Enable map as default.'=>'Aktiver kart som standard.','Open-Meteo'=>'Open-Meteo','SMHI'=>'SMHI','Yr (MET Norway)'=>'Yr (MET Norway)','MET Norway Nowcast'=>'MET Norway Nowcast','Recommended by MET Norway: include an email or URL in your User-Agent.'=>'Anbefalt av MET Norge: inkluder en e-postadresse eller URL i brukeragenten din.','Metric (°C, m/s, mm)'=>'Metrisk (°C, m/s, mm)','Metric (°C, km/h, mm)'=>'Metrisk (°C, km/t, mm)','Imperial (°F, mph, in)'=>'Imperial (°F, mph, in)','Temp unit'=>'Temp-enhet','Wind unit'=>'Vindenhet','Precip unit'=>'Nedbørsenhet','Used for forecast day labels.'=>'Brukes til etiketter for prognosedag.','Cache cleared.'=>'Hurtigbufferen er tømt.','Spelhubben Weather – Settings'=>'Spelhubben Vær – Innstillinger','Tune defaults, providers and formatting. Shortcodes now live on their own page.'=>'Juster standardinnstillinger, leverandører og formatering. Kortkoder finnes nå på sin egen side.','Clear cache (transients)'=>'Tøm hurtigbufferen (transienter)','Open Shortcodes'=>'Åpne kortkoder','General'=>'Generelt','Attribution'=>'Attribusjon','License requirements'=>'Lisenskrav','The attribution is locked to comply with OpenStreetMap/ODbL requirements.'=>'Attribusjonen er låst for å overholde OpenStreetMap/ODbL-kravene.','Why locked?'=>'Hvorfor låst?','To ensure proper crediting of data sources per ODbL and respective API policies.'=>'For å sikre riktig kreditering av datakilder i henhold til ODbL og respektive API-policyer.','Tips'=>'Tips','Use the Shortcodes page to quickly copy examples and see supported attributes.'=>'Bruk siden med kortkoder for å raskt kopiere eksempler og se støttede attributter.','Shortcode'=>'Kortkode','Forecast'=>'Prognose','Leaflet map'=>'Brosjyrekart','Basic example'=>'Grunnleggende eksempel','Compact with map & animation'=>'Kompakt med kart og animasjon','Inline without map'=>'Innebygd uten kart','Detailed with daily forecast & km/h'=>'Detaljert med daglig værmelding og km/t','Only temperature + wind, imperial'=>'Kun temperatur + vind, imperial','Basic example (legacy)'=>'Grunnleggende eksempel (eldre)','Compact with map & animation (legacy)'=>'Kompakt med kart og animasjon (eldre versjon)','Inline without map (legacy)'=>'Innebygd uten kart (eldre versjon)','Detailed with daily forecast & all providers (legacy)'=>'Detaljert med daglig prognose og alle leverandører (eldre)','Only temperature + wind, no map (legacy)'=>'Kun temperatur + vind, ikke noe kart (eldre)','Spelhubben Weather – Shortcodes'=>'Spelhubben Vær – Kortkoder','Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your clipboard.'=>'Kopier og lim inn ferdige utdrag. Klikk på «Kopier» for å legge inn en kortkode på utklippstavlen.','Back to Settings'=>'Tilbake til innstillinger','Search examples… e.g. inline, map, imperial'=>'Søkeeksempler… f.eks. innebygd, kart, imperial','Copy all (visible)'=>'Kopier alle (synlige)','Quick start – shortcodes'=>'Hurtigstart – kortkoder','new'=>'ny','Legacy shortcode examples (deprecated – will be removed soon)'=>'Eksempler på eldre kortkoder (utdatert – fjernes snart)','legacy'=>'legacy','Preview'=>'Forhåndsvisning','Click a snippet to send it here. You can edit, copy or expand the box.'=>'Klikk på et utdrag for å sende det hit. Du kan redigere, kopiere eller utvide boksen.','Clear'=>'Fjerne','Shortcode preview'=>'Forhåndsvisning av kortkode','Live preview'=>'Direkte forhåndsvisning','Shortcode live preview'=>'Forhåndsvisning av kortkode i sanntid','Attributes – overview'=>'Attributter – oversikt','Location'=>'Lokasjon','Display'=>'Fremvisning','Attribute'=>'Attributt','Description'=>'Beskrivelse','Example'=>'Eksempel','Place name to geocode (used if lat/lon are missing).'=>'Stedsnavn som skal geokodes (brukes hvis breddegrad/lengdegrad mangler).','Coordinates take precedence over place.'=>'Koordinater prioriteres fremfor sted.','Fields to display: temp,wind,icon'=>'Felt som skal vises: temp, vind, ikon','inline | compact | card | detailed'=>'innebygd | kompakt | kort | detaljert','1/0 to show/hide map'=>'1/0 for å vise/skjule kart','Map height in px (min 120).'=>'Karthøyde i piksler (min. 120).','openmeteo,smhi,yr,metno_nowcast (comma-separated)'=>'openmeteo,smhi,yr,metno_nowcast (kommaseparert)','1/0 – subtle animations'=>'1/0 – subtile animasjoner','none | daily'=>'ingen | daglig','Number of days in the forecast (3–10)'=>'Antall dager i værmeldingen (3–10)','Preset: metric | metric_kmh | imperial'=>'Forhåndsinnstilling: metrisk | metrisk_kmt | britisk','Override temperature unit'=>'Overstyr temperaturenhet','Override wind unit'=>'Overstyr vindenheten','Override precipitation unit'=>'Overstyr nedbørsenhet','Forecast date label (PHP date)'=>'Prognose-datoetikett (PHP-dato)','Inline'=>'Inline','Compact'=>'Kompakt','Card'=>'Kort','Detailed'=>'Detaljert','Place (name)'=>'Sted (navn)','Coordinates override place when set.'=>'Koordinater overstyrer sted når de er angitt.','Layout'=>'Oppsett','Fields (comma-separated)'=>'Felt (kommaseparert)','Show map'=>'Vis kart','Animations'=>'Animasjoner','Date format (PHP date)'=>'Datoformat (PHP-dato)','Used for forecast labels (default: D j/n)'=>'Brukes for prognoseetiketter (standard: D j/n)','Type'=>'Type','None'=>'Ingen','Daily'=>'Daglig','Days'=>'Dager','Spelhubben Weather preview (ServerSideRender unavailable). Save/update to view.'=>'Forhåndsvisning av Spelhubben-vær (ServerSideRender utilgjengelig). Lagre/oppdater for visning.','Display current weather with an optional forecast.'=>'Vis gjeldende vær med en valgfri værmelding.','Could not load %s.'=>'Kunne ikke laste %s.','Title:'=>'Tittel:','Place (name):'=>'Sted (navn):','Coordinates (optional):'=>'Koordinater (valgfritt):','Show:'=>'Vise:','Choose which parts to display in the widget.'=>'Velg hvilke deler som skal vises i widgeten.','Layout:'=>'Oppsett:','Map height (px):'=>'Karthøyde (px):','Forecast:'=>'Prognose:','Number of days (1–14):'=>'Antall dager (1–14):','Extra CSS class:'=>'Ekstra CSS-klasse:','Spelhubben Weather (legacy)'=>'Spelhubben Vær (arv)','Wind %s %s'=>'Vind %s %s','Wind: %s %s'=>'Vind: %s %s','Precipitation: %s %s'=>'Nedbør: %s %s','Cloud cover: %s%%'=>'Skydekke: %s%%','View on OpenStreetMap'=>'Vis på OpenStreetMap','Could not fetch weather data from the selected providers.'=>'Kunne ikke hente værdata fra de valgte leverandørene.','Could not find the place.'=>'Kunne ikke finne stedet.','Mostly clear'=>'Stort sett klart','Partly cloudy'=>'Delvis overskyet','Overcast'=>'Overskyet','Fog'=>'Tåke','Freezing fog'=>'Iskald tåke','Light drizzle'=>'Lett yr','Moderate drizzle'=>'Moderat yr','Dense drizzle'=>'Tett yr','Light rain'=>'Lett regn','Moderate rain'=>'Moderat regn','Heavy rain'=>'Kraftig regn','Light freezing rain'=>'Lett underkjølt regn','Heavy freezing rain'=>'Kraftig underkjølt regn','Light snowfall'=>'Lett snøfall','Moderate snowfall'=>'Moderat snøfall','Heavy snowfall'=>'Kraftig snøfall','Snow grains'=>'Snøkorn','Light rain showers'=>'Lett regnbyge','Moderate rain showers'=>'Moderate regnbyger','Violent rain showers'=>'Voldsomme regnbyger','Light snow showers'=>'Lette snøbyger','Heavy snow showers'=>'Kraftige snøbyger','Thunderstorm'=>'Tordenvær','Thunderstorm (slight hail)'=>'Tordenvær (lett hagl)','Thunderstorm (heavy hail)'=>'Tordenvær (kraftig hagl)','Clear sky'=>'Klar himmel','Depositing rime fog'=>'Avsetning av rimtåke','Drizzle: light'=>'Yrregn: lett','Drizzle: moderate'=>'Yr: moderat','Drizzle: dense'=>'Yr: tett','Rain: light'=>'Lett regn','Rain: moderate'=>'Regn: moderat','Rain: heavy'=>'Regn: kraftig','Freezing rain: light'=>'Underkjølt regn: lett','Freezing rain: heavy'=>'Underkjølt regn: kraftig','Snowfall: light'=>'Snøfall: lett','Snowfall: moderate'=>'Snøfall: moderat','Snowfall: heavy'=>'Snøfall: kraftig','Rain showers: slight'=>'Regnbyger: lett','Rain showers: moderate'=>'Regnbyger: moderat','Rain showers: violent'=>'Regnbyger: voldsomme','Snow showers: slight'=>'Snøbyger: lette','Snow showers: heavy'=>'Snøbyger: kraftig','Thunderstorm with slight hail'=>'Tordenvær med lett hagl','Thunderstorm with heavy hail'=>'Tordenvær med kraftig hagl','Precipitation'=>'Nedbør','Displays current weather and an optional forecast with a simple consensus across providers (Open-Meteo, SMHI, Yr/MET Norway). Supports shortcode + Gutenberg block + classic widget. Optional Leaflet map, subtle animations, daily forecast, and multiple layouts.'=>'Viser gjeldende vær og en valgfri værmelding med en enkel konsensus på tvers av leverandører (Open-Meteo, SMHI, Yr/MET Norge). Støtter shortcode + Gutenberg-blokk + klassisk widget. Valgfritt brosjyrekart, diskré animasjoner, daglig værmelding og flere oppsett.','Spelhubben'=>'Spelhubben']];
     3return ['domain'=>NULL,'plural-forms'=>'nplurals=2; plural=(n != 1);','language'=>'no','pot-creation-date'=>'2025-12-15 18:17+0100','po-revision-date'=>'2025-12-15 18:19+0100','translation-revision-date'=>'2025-12-15 18:19+0100','project-id-version'=>'Spelhubben Weather','x-generator'=>'Poedit 3.8','messages'=>['Copied!'=>'Kopiert!','Copy'=>'Kopier','Expand'=>'Utvid','Collapse'=>'Slå sammen','Rendering…'=>'Gjengivelse…','OK'=>'OK','Failed'=>'Mislyktes','Preview failed'=>'Forhåndsvisning mislyktes','Spelhubben Weather'=>'Spelhubben Været','Settings'=>'Innstillinger','Shortcodes'=>'Kortkode','Default settings'=>'Standardinnstillinger','Default place'=>'Standardsted','Cache TTL (minutes)'=>'Cache-TTL (minutter)','Default fields'=>'Standardfelt','Default layout'=>'Standardoppsett','Show map by default'=>'Vis kart som standard','Map height (px)'=>'Karthøyde (px)','Data providers'=>'Dataleverandører','Yr contact/UA'=>'Yr kontakt/UA','Units & format'=>'Enheter og format','Preset'=>'Forhåndsinnstilt','Overrides (optional)'=>'Overstyringer (valgfritt)','Date format (PHP)'=>'Datoformat (PHP)','e.g. Stockholm'=>'f.eks. Oslo','How long weather data is cached (transients).'=>'Hvor lenge værdata lagres i mellomlagring (transienter).','Comma-separated: temp,wind,icon'=>'Kommaseparert: temp, vind, ikon','layout label' . "\4" . 'Inline'=>'Innebygd','layout label' . "\4" . 'Compact'=>'Kompakt','layout label' . "\4" . 'Card'=>'Kort','layout label' . "\4" . 'Detailed'=>'Detaljert','Enable map as default.'=>'Aktiver kart som standard.','Classic'=>'Klassisk','Modern Flat'=>'Moderne leilighet','Modern Gradient'=>'Moderne gradient','Choose your preferred weather icon theme.'=>'Velg ditt foretrukne værikontema.','Open-Meteo'=>'Open-Meteo','SMHI'=>'SMHI','Yr (MET Norway)'=>'Yr (MET Norway)','MET Norway Nowcast'=>'MET Norway Nowcast','FMI (Finland, Open Data)'=>'FMI (Finland, Open Data)','Open-Weathermap'=>'Open-Weathermap','Weatherapi.com'=>'Weatherapi.com','Recommended by MET Norway: include an email or URL in your User-Agent.'=>'Anbefalt av MET Norge: inkluder en e-postadresse eller URL i brukeragenten din.','Metric (°C, m/s, mm)'=>'Metrisk (°C, m/s, mm)','Metric (°C, km/h, mm)'=>'Metrisk (°C, km/t, mm)','Imperial (°F, mph, in)'=>'Imperial (°F, mph, in)','Temp unit'=>'Temp-enhet','Wind unit'=>'Vindenhet','Precip unit'=>'Nedbørsenhet','Used for forecast day labels.'=>'Brukes til etiketter for prognosedag.','Cache cleared.'=>'Hurtigbufferen er tømt.','Spelhubben Weather – Settings'=>'Spelhubben Vær – Innstillinger','Tune defaults, providers and formatting. Shortcodes now live on their own page.'=>'Juster standardinnstillinger, leverandører og formatering. Kortkoder finnes nå på sin egen side.','Clear cache (transients)'=>'Tøm hurtigbufferen (transienter)','Open Shortcodes'=>'Åpne kortkoder','General'=>'Generelt','Attribution'=>'Attribusjon','License requirements'=>'Lisenskrav','The attribution is locked to comply with OpenStreetMap/ODbL requirements.'=>'Attribusjonen er låst for å overholde OpenStreetMap/ODbL-kravene.','Why locked?'=>'Hvorfor låst?','To ensure proper crediting of data sources per ODbL and respective API policies.'=>'For å sikre riktig kreditering av datakilder i henhold til ODbL og respektive API-policyer.','Tips'=>'Tips','Use the Shortcodes page to quickly copy examples and see supported attributes.'=>'Bruk siden med kortkoder for å raskt kopiere eksempler og se støttede attributter.','Shortcode'=>'Kortkode','Forecast'=>'Prognose','Leaflet map'=>'Brosjyrekart','Basic example'=>'Grunnleggende eksempel','Compact with map & animation'=>'Kompakt med kart og animasjon','Inline without map'=>'Innebygd uten kart','Detailed with daily forecast & km/h'=>'Detaljert med daglig værmelding og km/t','Only temperature + wind, imperial'=>'Kun temperatur + vind, imperial','Spelhubben Weather – Shortcodes'=>'Spelhubben Vær – Kortkoder','Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your clipboard.'=>'Kopier og lim inn ferdige utdrag. Klikk på «Kopier» for å legge inn en kortkode på utklippstavlen.','Back to Settings'=>'Tilbake til innstillinger','Search examples… e.g. inline, map, imperial'=>'Søkeeksempler… f.eks. innebygd, kart, imperial','Copy all (visible)'=>'Kopier alle (synlige)','Quick start – shortcodes'=>'Hurtigstart – kortkoder','Preview'=>'Forhåndsvisning','Click a snippet to send it here. You can edit, copy or expand the box.'=>'Klikk på et utdrag for å sende det hit. Du kan redigere, kopiere eller utvide boksen.','Clear'=>'Fjerne','Shortcode preview'=>'Forhåndsvisning av kortkode','Live preview'=>'Direkte forhåndsvisning','Shortcode live preview'=>'Forhåndsvisning av kortkode i sanntid','Attributes – overview'=>'Attributter – oversikt','Location'=>'Lokasjon','Display'=>'Fremvisning','Attribute'=>'Attributt','Description'=>'Beskrivelse','Example'=>'Eksempel','Place name to geocode (used if lat/lon are missing).'=>'Stedsnavn som skal geokodes (brukes hvis breddegrad/lengdegrad mangler).','Coordinates take precedence over place.'=>'Koordinater prioriteres fremfor sted.','Fields to display: temp,wind,icon'=>'Felt som skal vises: temp, vind, ikon','inline | compact | card | detailed'=>'innebygd | kompakt | kort | detaljert','1/0 to show/hide map'=>'1/0 for å vise/skjule kart','Map height in px (min 120).'=>'Karthøyde i piksler (min. 120).','openmeteo,smhi,yr,metno_nowcast (comma-separated)'=>'openmeteo,smhi,yr,metno_nowcast (kommaseparert)','1/0 – subtle animations'=>'1/0 – subtile animasjoner','none | daily'=>'ingen | daglig','Number of days in the forecast (3–10)'=>'Antall dager i værmeldingen (3–10)','Preset: metric | metric_kmh | imperial'=>'Forhåndsinnstilling: metrisk | metrisk_kmt | britisk','Override temperature unit'=>'Overstyr temperaturenhet','Override wind unit'=>'Overstyr vindenheten','Override precipitation unit'=>'Overstyr nedbørsenhet','Forecast date label (PHP date)'=>'Prognose-datoetikett (PHP-dato)','Inline'=>'Inline','Compact'=>'Kompakt','Card'=>'Kort','Detailed'=>'Detaljert','Place (name)'=>'Sted (navn)','Coordinates override place when set.'=>'Koordinater overstyrer sted når de er angitt.','Layout'=>'Oppsett','Fields (comma-separated)'=>'Felt (kommaseparert)','Show map'=>'Vis kart','Animations'=>'Animasjoner','Date format (PHP date)'=>'Datoformat (PHP-dato)','Used for forecast labels (default: D j/n)'=>'Brukes for prognoseetiketter (standard: D j/n)','Type'=>'Type','None'=>'Ingen','Daily'=>'Daglig','Days'=>'Dager','Spelhubben Weather preview (ServerSideRender unavailable). Save/update to view.'=>'Forhåndsvisning av Spelhubben-vær (ServerSideRender utilgjengelig). Lagre/oppdater for visning.','Display current weather with an optional forecast.'=>'Vis gjeldende vær med en valgfri værmelding.','Could not load %s.'=>'Kunne ikke laste %s.','Title:'=>'Tittel:','Place (name):'=>'Sted (navn):','Coordinates (optional):'=>'Koordinater (valgfritt):','Show:'=>'Vise:','Choose which parts to display in the widget.'=>'Velg hvilke deler som skal vises i widgeten.','Layout:'=>'Oppsett:','Map height (px):'=>'Karthøyde (px):','Forecast:'=>'Prognose:','Number of days (1–14):'=>'Antall dager (1–14):','Extra CSS class:'=>'Ekstra CSS-klasse:','Spelhubben Weather (legacy)'=>'Spelhubben Vær (arv)','Wind %1$s %2$s'=>'Vind %1$s %2$s','Wind: %1$s %2$s'=>'Vind: %1$s %2$s','Precipitation: %1$s %2$s'=>'Nedbør: %1$s %2$s','Cloud cover: %s%%'=>'Skydekke: %s%%','View on OpenStreetMap'=>'Vis på OpenStreetMap','Provider Comparison'=>'Leverandørsammenligning','sources'=>'kilder','Note:'=>'Note:','Each provider may report different values due to different measuring stations or calculation methods. Use this view to compare accuracy and availability.'=>'Hver leverandør kan rapportere forskjellige verdier på grunn av forskjellige målestasjoner eller beregningsmetoder. Bruk denne visningen til å sammenligne nøyaktighet og tilgjengelighet.','Could not fetch weather data from the selected providers.'=>'Kunne ikke hente værdata fra de valgte leverandørene.','Could not find the place.'=>'Kunne ikke finne stedet.','Could not fetch plugin list right now.'=>'Kunne ikke hente listen over pluginer akkurat nå.','Retry'=>'Prøv på nytt','No other plugins found.'=>'Ingen andre programtillegg funnet.','Other plugins by Spelhubben:'=>'Andre programtillegg fra Spelhubben:','Details'=>'Detaljer','WP.org'=>'WP.org','Active:'=>'Aktiv:','Tested:'=>'Testet:','Unknown'=>'Ukjent','Mostly clear'=>'Stort sett klart','Partly cloudy'=>'Delvis overskyet','Overcast'=>'Overskyet','Fog'=>'Tåke','Freezing fog'=>'Iskald tåke','Light drizzle'=>'Lett yr','Moderate drizzle'=>'Moderat yr','Dense drizzle'=>'Tett yr','Light rain'=>'Lett regn','Moderate rain'=>'Moderat regn','Heavy rain'=>'Kraftig regn','Light freezing rain'=>'Lett underkjølt regn','Heavy freezing rain'=>'Kraftig underkjølt regn','Light snowfall'=>'Lett snøfall','Moderate snowfall'=>'Moderat snøfall','Heavy snowfall'=>'Kraftig snøfall','Snow grains'=>'Snøkorn','Light rain showers'=>'Lett regnbyge','Moderate rain showers'=>'Moderate regnbyger','Violent rain showers'=>'Voldsomme regnbyger','Light snow showers'=>'Lette snøbyger','Heavy snow showers'=>'Kraftige snøbyger','Thunderstorm'=>'Tordenvær','Thunderstorm (slight hail)'=>'Tordenvær (lett hagl)','Thunderstorm (heavy hail)'=>'Tordenvær (kraftig hagl)','Clear sky'=>'Klar himmel','Depositing rime fog'=>'Avsetning av rimtåke','Drizzle: light'=>'Yrregn: lett','Drizzle: moderate'=>'Yr: moderat','Drizzle: dense'=>'Yr: tett','Rain: light'=>'Lett regn','Rain: moderate'=>'Regn: moderat','Rain: heavy'=>'Regn: kraftig','Freezing rain: light'=>'Underkjølt regn: lett','Freezing rain: heavy'=>'Underkjølt regn: kraftig','Snowfall: light'=>'Snøfall: lett','Snowfall: moderate'=>'Snøfall: moderat','Snowfall: heavy'=>'Snøfall: kraftig','Rain showers: slight'=>'Regnbyger: lett','Rain showers: moderate'=>'Regnbyger: moderat','Rain showers: violent'=>'Regnbyger: voldsomme','Snow showers: slight'=>'Snøbyger: lette','Snow showers: heavy'=>'Snøbyger: kraftig','Thunderstorm with slight hail'=>'Tordenvær med lett hagl','Thunderstorm with heavy hail'=>'Tordenvær med kraftig hagl','Precipitation'=>'Nedbør','Displays current weather and an optional forecast with a simple consensus across providers (Open-Meteo, SMHI, Yr/MET Norway). Supports shortcode + Gutenberg block + classic widget. Optional Leaflet map, subtle animations, daily forecast, and multiple layouts.'=>'Viser gjeldende vær og en valgfri værmelding med en enkel konsensus på tvers av leverandører (Open-Meteo, SMHI, Yr/MET Norge). Støtter shortcode + Gutenberg-blokk + klassisk widget. Valgfritt brosjyrekart, diskré animasjoner, daglig værmelding og flere oppsett.','Spelhubben'=>'Spelhubben']];
  • spelhubben-weather/trunk/languages/spelhubben-weather-nb_NO.po

    r3372751 r3420396  
    33msgstr ""
    44"Project-Id-Version: Spelhubben Weather\n"
    5 "POT-Creation-Date: 2025-10-04 09:32+0200\n"
    6 "PO-Revision-Date: 2025-10-04 09:53+0200\n"
     5"POT-Creation-Date: 2025-12-15 18:17+0100\n"
     6"PO-Revision-Date: 2025-12-15 18:19+0100\n"
    77"Last-Translator: \n"
    88"Language-Team: \n"
     
    1111"Content-Type: text/plain; charset=UTF-8\n"
    1212"Content-Transfer-Encoding: 8bit\n"
    13 "X-Generator: Poedit 3.7\n"
     13"X-Generator: Poedit 3.8\n"
    1414"X-Poedit-Basepath: ..\n"
    1515"X-Poedit-Flags-xgettext: --add-comments=translators:\n"
     
    2222"X-Poedit-SearchPathExcluded-1: assets/vendor\n"
    2323
    24 #: admin/admin.php:49
     24#: admin/admin.php:55
    2525msgid "Copied!"
    2626msgstr "Kopiert!"
    2727
    28 #: admin/admin.php:50 admin/page-shortcodes.php:85
    29 #: admin/page-shortcodes.php:108 admin/page-shortcodes.php:134
     28#: admin/admin.php:56 admin/page-shortcodes.php:68 admin/page-shortcodes.php:93
    3029msgid "Copy"
    3130msgstr "Kopier"
    3231
    33 #: admin/admin.php:51 admin/page-shortcodes.php:140
     32#: admin/admin.php:57 admin/page-shortcodes.php:99
    3433msgid "Expand"
    3534msgstr "Utvid"
    3635
    37 #: admin/admin.php:52
     36#: admin/admin.php:58
    3837msgid "Collapse"
    3938msgstr "Slå sammen"
    4039
    41 #: admin/admin.php:53
     40#: admin/admin.php:59
    4241msgid "Rendering…"
    4342msgstr "Gjengivelse…"
    4443
    45 #: admin/admin.php:54
     44#: admin/admin.php:60
    4645msgid "OK"
    4746msgstr "OK"
    4847
    49 #: admin/admin.php:55
     48#: admin/admin.php:61
    5049msgid "Failed"
    5150msgstr "Mislyktes"
    5251
    53 #: admin/admin.php:56
     52#: admin/admin.php:62
    5453msgid "Preview failed"
    5554msgstr "Forhåndsvisning mislyktes"
    5655
    5756#. Plugin Name of the plugin/theme
    58 #: admin/admin.php:87 admin/admin.php:88 includes/Widget/class-widget.php:19
     57#: admin/admin.php:93 admin/admin.php:94 includes/Widget/class-widget.php:19
    5958msgid "Spelhubben Weather"
    6059msgstr "Spelhubben Været"
    6160
    62 #: admin/admin.php:99 admin/admin.php:100 includes/class-plugin.php:114
     61#: admin/admin.php:105 admin/admin.php:106 includes/class-plugin.php:104
    6362msgid "Settings"
    6463msgstr "Innstillinger"
    6564
    66 #: admin/admin.php:109 admin/admin.php:110
     65#: admin/admin.php:115 admin/admin.php:116
    6766msgid "Shortcodes"
    6867msgstr "Kortkode"
    6968
    70 #: admin/admin.php:132 admin/page-settings.php:44
     69#: admin/admin.php:138 admin/page-settings.php:44
    7170msgid "Default settings"
    7271msgstr "Standardinnstillinger"
    7372
    74 #: admin/admin.php:134
     73#: admin/admin.php:140
    7574msgid "Default place"
    7675msgstr "Standardsted"
    7776
    78 #: admin/admin.php:135
     77#: admin/admin.php:141
    7978msgid "Cache TTL (minutes)"
    8079msgstr "Cache-TTL (minutter)"
    8180
    82 #: admin/admin.php:136
     81#: admin/admin.php:142
    8382msgid "Default fields"
    8483msgstr "Standardfelt"
    8584
    86 #: admin/admin.php:137
     85#: admin/admin.php:143
    8786msgid "Default layout"
    8887msgstr "Standardoppsett"
    8988
    90 #: admin/admin.php:138
     89#: admin/admin.php:144
    9190msgid "Show map by default"
    9291msgstr "Vis kart som standard"
    9392
    94 #: admin/admin.php:139 blocks/spelhubben-weather/index.js:59
     93#: admin/admin.php:145 blocks/spelhubben-weather/index.js:59
    9594msgid "Map height (px)"
    9695msgstr "Karthøyde (px)"
    9796
    98 #: admin/admin.php:140
     97#: admin/admin.php:146
     98msgid "Icon style"
     99msgstr ""
     100
     101#: admin/admin.php:147
    99102msgid "Data providers"
    100103msgstr "Dataleverandører"
    101104
    102 #: admin/admin.php:141
     105#: admin/admin.php:148
    103106msgid "Yr contact/UA"
    104107msgstr "Yr kontakt/UA"
    105108
    106 #: admin/admin.php:144 admin/page-shortcodes.php:166
     109#: admin/admin.php:151 admin/page-shortcodes.php:125
    107110#: blocks/spelhubben-weather/index.js:68
    108111msgid "Units & format"
    109112msgstr "Enheter og format"
    110113
    111 #: admin/admin.php:145 blocks/spelhubben-weather/index.js:70
     114#: admin/admin.php:152 blocks/spelhubben-weather/index.js:70
    112115msgid "Preset"
    113116msgstr "Forhåndsinnstilt"
    114117
    115 #: admin/admin.php:146
     118#: admin/admin.php:153
    116119msgid "Overrides (optional)"
    117120msgstr "Overstyringer (valgfritt)"
    118121
    119 #: admin/admin.php:147
     122#: admin/admin.php:154
    120123msgid "Date format (PHP)"
    121124msgstr "Datoformat (PHP)"
    122125
    123 #: admin/admin.php:157 blocks/spelhubben-weather/index.js:36
     126#: admin/admin.php:164 blocks/spelhubben-weather/index.js:36
    124127msgid "e.g. Stockholm"
    125128msgstr "f.eks. Oslo"
    126129
    127 #: admin/admin.php:171
     130#: admin/admin.php:178
    128131msgid "How long weather data is cached (transients)."
    129132msgstr "Hvor lenge værdata lagres i mellomlagring (transienter)."
    130133
    131 #: admin/admin.php:180
     134#: admin/admin.php:187
    132135msgid "Comma-separated: temp,wind,icon"
    133136msgstr "Kommaseparert: temp, vind, ikon"
    134137
    135 #: admin/admin.php:186
     138#: admin/admin.php:193
    136139msgctxt "layout label"
    137140msgid "Inline"
    138141msgstr "Innebygd"
    139142
    140 #: admin/admin.php:187
     143#: admin/admin.php:194
    141144msgctxt "layout label"
    142145msgid "Compact"
    143146msgstr "Kompakt"
    144147
    145 #: admin/admin.php:188
     148#: admin/admin.php:195
    146149msgctxt "layout label"
    147150msgid "Card"
    148151msgstr "Kort"
    149152
    150 #: admin/admin.php:189
     153#: admin/admin.php:196
    151154msgctxt "layout label"
    152155msgid "Detailed"
    153156msgstr "Detaljert"
    154157
    155 #: admin/admin.php:208
     158#: admin/admin.php:215
    156159msgid "Enable map as default."
    157160msgstr "Aktiver kart som standard."
    158161
    159 #: admin/admin.php:225
     162#: admin/admin.php:230
     163msgid "Classic"
     164msgstr "Klassisk"
     165
     166#: admin/admin.php:231
     167msgid "Modern Flat"
     168msgstr "Moderne leilighet"
     169
     170#: admin/admin.php:232
     171msgid "Modern Gradient"
     172msgstr "Moderne gradient"
     173
     174#: admin/admin.php:244
     175msgid "Choose your preferred weather icon theme."
     176msgstr "Velg ditt foretrukne værikontema."
     177
     178#: admin/admin.php:252
    160179msgid "Open-Meteo"
    161180msgstr "Open-Meteo"
    162181
    163 #: admin/admin.php:230
     182#: admin/admin.php:257
    164183msgid "SMHI"
    165184msgstr "SMHI"
    166185
    167 #: admin/admin.php:235
     186#: admin/admin.php:262
    168187msgid "Yr (MET Norway)"
    169188msgstr "Yr (MET Norway)"
    170189
    171 #: admin/admin.php:240
     190#: admin/admin.php:267
    172191msgid "MET Norway Nowcast"
    173192msgstr "MET Norway Nowcast"
    174193
    175 #: admin/admin.php:250
     194#: admin/admin.php:273
     195msgid "FMI (Finland, Open Data)"
     196msgstr "FMI (Finland, Open Data)"
     197
     198#: admin/admin.php:278
     199msgid "Open-Weathermap"
     200msgstr "Open-Weathermap"
     201
     202#: admin/admin.php:283
     203msgid "Weatherapi.com"
     204msgstr "Weatherapi.com"
     205
     206#: admin/admin.php:293
    176207msgid "Recommended by MET Norway: include an email or URL in your User-Agent."
    177208msgstr ""
     
    179210"din."
    180211
    181 #: admin/admin.php:256 blocks/spelhubben-weather/index.js:16
     212#: admin/admin.php:299 blocks/spelhubben-weather/index.js:16
    182213msgid "Metric (°C, m/s, mm)"
    183214msgstr "Metrisk (°C, m/s, mm)"
    184215
    185 #: admin/admin.php:257 blocks/spelhubben-weather/index.js:17
     216#: admin/admin.php:300 blocks/spelhubben-weather/index.js:17
    186217msgid "Metric (°C, km/h, mm)"
    187218msgstr "Metrisk (°C, km/t, mm)"
    188219
    189 #: admin/admin.php:258 blocks/spelhubben-weather/index.js:18
     220#: admin/admin.php:301 blocks/spelhubben-weather/index.js:18
    190221msgid "Imperial (°F, mph, in)"
    191222msgstr "Imperial (°F, mph, in)"
    192223
    193 #: admin/admin.php:276
     224#: admin/admin.php:319
    194225msgid "Temp unit"
    195226msgstr "Temp-enhet"
    196227
    197 #: admin/admin.php:281
     228#: admin/admin.php:324
    198229msgid "Wind unit"
    199230msgstr "Vindenhet"
    200231
    201 #: admin/admin.php:286
     232#: admin/admin.php:329
    202233msgid "Precip unit"
    203234msgstr "Nedbørsenhet"
    204235
    205 #: admin/admin.php:297
     236#: admin/admin.php:340
    206237msgid "Used for forecast day labels."
    207238msgstr "Brukes til etiketter for prognosedag."
     
    276307msgstr "Kortkode"
    277308
    278 #: admin/page-settings.php:91 admin/page-shortcodes.php:165
     309#: admin/page-settings.php:91 admin/page-shortcodes.php:124
    279310#: blocks/spelhubben-weather/index.js:84
    280311msgid "Forecast"
     
    285316msgstr "Brosjyrekart"
    286317
    287 #: admin/page-shortcodes.php:27
     318#: admin/page-shortcodes.php:20
    288319msgid "Basic example"
    289320msgstr "Grunnleggende eksempel"
    290321
    291 #: admin/page-shortcodes.php:28
     322#: admin/page-shortcodes.php:21
    292323msgid "Compact with map & animation"
    293324msgstr "Kompakt med kart og animasjon"
    294325
    295 #: admin/page-shortcodes.php:29
     326#: admin/page-shortcodes.php:22
    296327msgid "Inline without map"
    297328msgstr "Innebygd uten kart"
    298329
    299 #: admin/page-shortcodes.php:30
     330#: admin/page-shortcodes.php:23
    300331msgid "Detailed with daily forecast & km/h"
    301332msgstr "Detaljert med daglig værmelding og km/t"
    302333
    303 #: admin/page-shortcodes.php:31
     334#: admin/page-shortcodes.php:24
    304335msgid "Only temperature + wind, imperial"
    305336msgstr "Kun temperatur + vind, imperial"
    306337
    307 #: admin/page-shortcodes.php:35
    308 msgid "Basic example (legacy)"
    309 msgstr "Grunnleggende eksempel (eldre)"
    310 
    311 #: admin/page-shortcodes.php:36
    312 msgid "Compact with map & animation (legacy)"
    313 msgstr "Kompakt med kart og animasjon (eldre versjon)"
    314 
    315 #: admin/page-shortcodes.php:37
    316 msgid "Inline without map (legacy)"
    317 msgstr "Innebygd uten kart (eldre versjon)"
    318 
    319 #: admin/page-shortcodes.php:38
    320 msgid "Detailed with daily forecast & all providers (legacy)"
    321 msgstr "Detaljert med daglig prognose og alle leverandører (eldre)"
    322 
    323 #: admin/page-shortcodes.php:39
    324 msgid "Only temperature + wind, no map (legacy)"
    325 msgstr "Kun temperatur + vind, ikke noe kart (eldre)"
    326 
    327 #: admin/page-shortcodes.php:43
     338#: admin/page-shortcodes.php:28
    328339msgid "Spelhubben Weather – Shortcodes"
    329340msgstr "Spelhubben Vær – Kortkoder"
    330341
    331 #: admin/page-shortcodes.php:44
     342#: admin/page-shortcodes.php:29
    332343msgid ""
    333344"Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your "
     
    337348"kortkode på utklippstavlen."
    338349
    339 #: admin/page-shortcodes.php:50 admin/page-shortcodes.php:204
     350#: admin/page-shortcodes.php:35 admin/page-shortcodes.php:163
    340351msgid "Back to Settings"
    341352msgstr "Tilbake til innstillinger"
    342353
    343 #: admin/page-shortcodes.php:55
     354#: admin/page-shortcodes.php:40
    344355msgid "Search examples… e.g. inline, map, imperial"
    345356msgstr "Søkeeksempler… f.eks. innebygd, kart, imperial"
    346357
    347 #: admin/page-shortcodes.php:61
     358#: admin/page-shortcodes.php:46
    348359msgid "Copy all (visible)"
    349360msgstr "Kopier alle (synlige)"
    350361
    351 #: admin/page-shortcodes.php:71
     362#: admin/page-shortcodes.php:56
    352363msgid "Quick start – shortcodes"
    353364msgstr "Hurtigstart – kortkoder"
    354365
    355 #: admin/page-shortcodes.php:82
    356 msgid "new"
    357 msgstr "ny"
    358 
    359 #: admin/page-shortcodes.php:95
    360 msgid "Legacy shortcode examples (deprecated – will be removed soon)"
    361 msgstr "Eksempler på eldre kortkoder (utdatert – fjernes snart)"
    362 
    363 #: admin/page-shortcodes.php:105
    364 msgid "legacy"
    365 msgstr "legacy"
    366 
    367 #: admin/page-shortcodes.php:126
     366#: admin/page-shortcodes.php:85
    368367msgid "Preview"
    369368msgstr "Forhåndsvisning"
    370369
    371 #: admin/page-shortcodes.php:129
     370#: admin/page-shortcodes.php:88
    372371msgid "Click a snippet to send it here. You can edit, copy or expand the box."
    373372msgstr ""
     
    375374"utvide boksen."
    376375
    377 #: admin/page-shortcodes.php:137 includes/i18n.php:47
     376#: admin/page-shortcodes.php:96 includes/i18n.php:47
    378377msgid "Clear"
    379378msgstr "Fjerne"
    380379
    381 #: admin/page-shortcodes.php:144
     380#: admin/page-shortcodes.php:103
    382381msgid "Shortcode preview"
    383382msgstr "Forhåndsvisning av kortkode"
    384383
    385 #: admin/page-shortcodes.php:148
     384#: admin/page-shortcodes.php:107
    386385msgid "Live preview"
    387386msgstr "Direkte forhåndsvisning"
    388387
    389 #: admin/page-shortcodes.php:152
     388#: admin/page-shortcodes.php:111
    390389msgid "Shortcode live preview"
    391390msgstr "Forhåndsvisning av kortkode i sanntid"
    392391
    393 #: admin/page-shortcodes.php:159
     392#: admin/page-shortcodes.php:118
    394393msgid "Attributes – overview"
    395394msgstr "Attributter – oversikt"
    396395
    397 #: admin/page-shortcodes.php:163 blocks/spelhubben-weather/index.js:31
     396#: admin/page-shortcodes.php:122 blocks/spelhubben-weather/index.js:31
    398397msgid "Location"
    399398msgstr "Lokasjon"
    400399
    401 #: admin/page-shortcodes.php:164 blocks/spelhubben-weather/index.js:43
     400#: admin/page-shortcodes.php:123 blocks/spelhubben-weather/index.js:43
    402401msgid "Display"
    403402msgstr "Fremvisning"
    404403
    405 #: admin/page-shortcodes.php:173
     404#: admin/page-shortcodes.php:132
    406405msgid "Attribute"
    407406msgstr "Attributt"
    408407
    409 #: admin/page-shortcodes.php:174
     408#: admin/page-shortcodes.php:133
    410409msgid "Description"
    411410msgstr "Beskrivelse"
    412411
    413 #: admin/page-shortcodes.php:175
     412#: admin/page-shortcodes.php:134
    414413msgid "Example"
    415414msgstr "Eksempel"
    416415
    417 #: admin/page-shortcodes.php:179
     416#: admin/page-shortcodes.php:138
    418417msgid "Place name to geocode (used if lat/lon are missing)."
    419418msgstr ""
    420419"Stedsnavn som skal geokodes (brukes hvis breddegrad/lengdegrad mangler)."
    421420
    422 #: admin/page-shortcodes.php:180
     421#: admin/page-shortcodes.php:139
    423422msgid "Coordinates take precedence over place."
    424423msgstr "Koordinater prioriteres fremfor sted."
    425424
    426 #: admin/page-shortcodes.php:182
     425#: admin/page-shortcodes.php:141
    427426msgid "Fields to display: temp,wind,icon"
    428427msgstr "Felt som skal vises: temp, vind, ikon"
    429428
    430 #: admin/page-shortcodes.php:183
     429#: admin/page-shortcodes.php:142
    431430msgid "inline | compact | card | detailed"
    432431msgstr "innebygd | kompakt | kort | detaljert"
    433432
    434 #: admin/page-shortcodes.php:184
     433#: admin/page-shortcodes.php:143
    435434msgid "1/0 to show/hide map"
    436435msgstr "1/0 for å vise/skjule kart"
    437436
    438 #: admin/page-shortcodes.php:185
     437#: admin/page-shortcodes.php:144
    439438msgid "Map height in px (min 120)."
    440439msgstr "Karthøyde i piksler (min. 120)."
    441440
    442 #: admin/page-shortcodes.php:186
     441#: admin/page-shortcodes.php:145
    443442msgid "openmeteo,smhi,yr,metno_nowcast (comma-separated)"
    444443msgstr "openmeteo,smhi,yr,metno_nowcast (kommaseparert)"
    445444
    446 #: admin/page-shortcodes.php:187
     445#: admin/page-shortcodes.php:146
    447446msgid "1/0 – subtle animations"
    448447msgstr "1/0 – subtile animasjoner"
    449448
    450 #: admin/page-shortcodes.php:189
     449#: admin/page-shortcodes.php:148
    451450msgid "none | daily"
    452451msgstr "ingen | daglig"
    453452
    454 #: admin/page-shortcodes.php:190
     453#: admin/page-shortcodes.php:149
    455454msgid "Number of days in the forecast (3–10)"
    456455msgstr "Antall dager i værmeldingen (3–10)"
    457456
    458 #: admin/page-shortcodes.php:192
     457#: admin/page-shortcodes.php:151
    459458msgid "Preset: metric | metric_kmh | imperial"
    460459msgstr "Forhåndsinnstilling: metrisk | metrisk_kmt | britisk"
    461460
    462 #: admin/page-shortcodes.php:193
     461#: admin/page-shortcodes.php:152
    463462msgid "Override temperature unit"
    464463msgstr "Overstyr temperaturenhet"
    465464
    466 #: admin/page-shortcodes.php:194
     465#: admin/page-shortcodes.php:153
    467466msgid "Override wind unit"
    468467msgstr "Overstyr vindenheten"
    469468
    470 #: admin/page-shortcodes.php:195
     469#: admin/page-shortcodes.php:154
    471470msgid "Override precipitation unit"
    472471msgstr "Overstyr nedbørsenhet"
    473472
    474 #: admin/page-shortcodes.php:196
     473#: admin/page-shortcodes.php:155
    475474msgid "Forecast date label (PHP date)"
    476475msgstr "Prognose-datoetikett (PHP-dato)"
     
    602601msgstr "Spelhubben Vær (arv)"
    603602
    604 #: includes/class-renderer.php:109
     603#. translators: 1: wind value, 2: wind unit (e.g. 5, km/h)
     604#: includes/class-renderer.php:123
    605605#, php-format
    606 msgid "Wind %s %s"
    607 msgstr "Vind %s %s"
    608 
    609 #: includes/class-renderer.php:128 includes/class-renderer.php:159
     606msgid "Wind %1$s %2$s"
     607msgstr "Vind %1$s %2$s"
     608
     609#. translators: 1: wind value, 2: wind unit (e.g. 5, km/h)
     610#: includes/class-renderer.php:146 includes/class-renderer.php:189
    610611#, php-format
    611 msgid "Wind: %s %s"
    612 msgstr "Vind: %s %s"
    613 
    614 #: includes/class-renderer.php:136
     612msgid "Wind: %1$s %2$s"
     613msgstr "Vind: %1$s %2$s"
     614
     615#. translators: 1: precipitation value, 2: precipitation unit (e.g. 1.2, mm)
     616#: includes/class-renderer.php:158
    615617#, php-format
    616 msgid "Precipitation: %s %s"
    617 msgstr "Nedbør: %s %s"
    618 
    619 #: includes/class-renderer.php:139
     618msgid "Precipitation: %1$s %2$s"
     619msgstr "Nedbør: %1$s %2$s"
     620
     621#. translators: %s: cloud cover percent (0–100)
     622#: includes/class-renderer.php:165
    620623#, php-format
    621624msgid "Cloud cover: %s%%"
    622625msgstr "Skydekke: %s%%"
    623626
    624 #: includes/class-renderer.php:178
     627#: includes/class-renderer.php:211
    625628msgid "View on OpenStreetMap"
    626629msgstr "Vis på OpenStreetMap"
    627630
    628 #: includes/class-sv-vader.php:53
     631#: includes/class-renderer.php:269
     632msgid "Provider Comparison"
     633msgstr "Leverandørsammenligning"
     634
     635#: includes/class-renderer.php:269
     636msgid "sources"
     637msgstr "kilder"
     638
     639#: includes/class-renderer.php:317
     640msgid "Note:"
     641msgstr "Note:"
     642
     643#: includes/class-renderer.php:318
     644msgid ""
     645"Each provider may report different values due to different measuring "
     646"stations or calculation methods. Use this view to compare accuracy and "
     647"availability."
     648msgstr ""
     649"Hver leverandør kan rapportere forskjellige verdier på grunn av forskjellige "
     650"målestasjoner eller beregningsmetoder. Bruk denne visningen til å "
     651"sammenligne nøyaktighet og tilgjengelighet."
     652
     653#: includes/class-sv-vader.php:65
    629654msgid "Could not fetch weather data from the selected providers."
    630655msgstr "Kunne ikke hente værdata fra de valgte leverandørene."
    631656
    632 #: includes/class-sv-vader.php:106
     657#: includes/class-sv-vader.php:188
    633658msgid "Could not find the place."
    634659msgstr "Kunne ikke finne stedet."
    635660
    636 #: includes/i18n.php:48 includes/providers.php:125
     661#: includes/class-wporg-plugins.php:189
     662msgid "Could not fetch plugin list right now."
     663msgstr "Kunne ikke hente listen over pluginer akkurat nå."
     664
     665#: includes/class-wporg-plugins.php:194
     666msgid "Retry"
     667msgstr "Prøv på nytt"
     668
     669#: includes/class-wporg-plugins.php:200
     670msgid "No other plugins found."
     671msgstr "Ingen andre programtillegg funnet."
     672
     673#: includes/class-wporg-plugins.php:223
     674msgid "Other plugins by Spelhubben:"
     675msgstr "Andre programtillegg fra Spelhubben:"
     676
     677#: includes/class-wporg-plugins.php:281
     678msgid "Details"
     679msgstr "Detaljer"
     680
     681#: includes/class-wporg-plugins.php:282
     682msgid "WP.org"
     683msgstr "WP.org"
     684
     685#: includes/class-wporg-plugins.php:309
     686msgid "Active:"
     687msgstr "Aktiv:"
     688
     689#: includes/class-wporg-plugins.php:314
     690msgid "Tested:"
     691msgstr "Testet:"
     692
     693#: includes/class-wporg-plugins.php:315
     694msgid "Unknown"
     695msgstr "Ukjent"
     696
     697#: includes/i18n.php:48 includes/providers.php:248
    637698msgid "Mostly clear"
    638699msgstr "Stort sett klart"
    639700
    640 #: includes/i18n.php:49 includes/providers.php:126 includes/providers.php:196
     701#: includes/i18n.php:49 includes/providers.php:249 includes/providers.php:319
    641702msgid "Partly cloudy"
    642703msgstr "Delvis overskyet"
    643704
    644 #: includes/i18n.php:50 includes/providers.php:127 includes/providers.php:198
     705#: includes/i18n.php:50 includes/providers.php:250 includes/providers.php:321
    645706msgid "Overcast"
    646707msgstr "Overskyet"
    647708
    648 #: includes/i18n.php:51 includes/providers.php:128
     709#: includes/i18n.php:51 includes/providers.php:251
    649710msgid "Fog"
    650711msgstr "Tåke"
     
    698759msgstr "Kraftig snøfall"
    699760
    700 #: includes/i18n.php:64 includes/providers.php:141
     761#: includes/i18n.php:64 includes/providers.php:264
    701762msgid "Snow grains"
    702763msgstr "Snøkorn"
     
    722783msgstr "Kraftige snøbyger"
    723784
    724 #: includes/i18n.php:70 includes/providers.php:147
     785#: includes/i18n.php:70 includes/providers.php:270
    725786msgid "Thunderstorm"
    726787msgstr "Tordenvær"
     
    734795msgstr "Tordenvær (kraftig hagl)"
    735796
    736 #: includes/providers.php:124 includes/providers.php:194
     797#: includes/providers.php:247 includes/providers.php:317
    737798msgid "Clear sky"
    738799msgstr "Klar himmel"
    739800
    740 #: includes/providers.php:129
     801#: includes/providers.php:252
    741802msgid "Depositing rime fog"
    742803msgstr "Avsetning av rimtåke"
    743804
    744 #: includes/providers.php:130
     805#: includes/providers.php:253
    745806msgid "Drizzle: light"
    746807msgstr "Yrregn: lett"
    747808
    748 #: includes/providers.php:131
     809#: includes/providers.php:254
    749810msgid "Drizzle: moderate"
    750811msgstr "Yr: moderat"
    751812
    752 #: includes/providers.php:132
     813#: includes/providers.php:255
    753814msgid "Drizzle: dense"
    754815msgstr "Yr: tett"
    755816
    756 #: includes/providers.php:133
     817#: includes/providers.php:256
    757818msgid "Rain: light"
    758819msgstr "Lett regn"
    759820
    760 #: includes/providers.php:134
     821#: includes/providers.php:257
    761822msgid "Rain: moderate"
    762823msgstr "Regn: moderat"
    763824
    764 #: includes/providers.php:135
     825#: includes/providers.php:258
    765826msgid "Rain: heavy"
    766827msgstr "Regn: kraftig"
    767828
    768 #: includes/providers.php:136
     829#: includes/providers.php:259
    769830msgid "Freezing rain: light"
    770831msgstr "Underkjølt regn: lett"
    771832
    772 #: includes/providers.php:137
     833#: includes/providers.php:260
    773834msgid "Freezing rain: heavy"
    774835msgstr "Underkjølt regn: kraftig"
    775836
    776 #: includes/providers.php:138
     837#: includes/providers.php:261
    777838msgid "Snowfall: light"
    778839msgstr "Snøfall: lett"
    779840
    780 #: includes/providers.php:139
     841#: includes/providers.php:262
    781842msgid "Snowfall: moderate"
    782843msgstr "Snøfall: moderat"
    783844
    784 #: includes/providers.php:140
     845#: includes/providers.php:263
    785846msgid "Snowfall: heavy"
    786847msgstr "Snøfall: kraftig"
    787848
    788 #: includes/providers.php:142
     849#: includes/providers.php:265
    789850msgid "Rain showers: slight"
    790851msgstr "Regnbyger: lett"
    791852
    792 #: includes/providers.php:143
     853#: includes/providers.php:266
    793854msgid "Rain showers: moderate"
    794855msgstr "Regnbyger: moderat"
    795856
    796 #: includes/providers.php:144
     857#: includes/providers.php:267
    797858msgid "Rain showers: violent"
    798859msgstr "Regnbyger: voldsomme"
    799860
    800 #: includes/providers.php:145
     861#: includes/providers.php:268
    801862msgid "Snow showers: slight"
    802863msgstr "Snøbyger: lette"
    803864
    804 #: includes/providers.php:146
     865#: includes/providers.php:269
    805866msgid "Snow showers: heavy"
    806867msgstr "Snøbyger: kraftig"
    807868
    808 #: includes/providers.php:148
     869#: includes/providers.php:271
    809870msgid "Thunderstorm with slight hail"
    810871msgstr "Tordenvær med lett hagl"
    811872
    812 #: includes/providers.php:149
     873#: includes/providers.php:272
    813874msgid "Thunderstorm with heavy hail"
    814875msgstr "Tordenvær med kraftig hagl"
    815876
    816 #: includes/providers.php:191
     877#: includes/providers.php:314
    817878msgid "Precipitation"
    818879msgstr "Nedbør"
     
    825886"daily forecast, and multiple layouts."
    826887msgstr ""
    827 "Viser gjeldende vær og en valgfri værmelding med en enkel konsensus på "
    828 "tvers av leverandører (Open-Meteo, SMHI, Yr/MET Norge). Støtter shortcode + "
     888"Viser gjeldende vær og en valgfri værmelding med en enkel konsensus på tvers "
     889"av leverandører (Open-Meteo, SMHI, Yr/MET Norge). Støtter shortcode + "
    829890"Gutenberg-blokk + klassisk widget. Valgfritt brosjyrekart, diskré "
    830891"animasjoner, daglig værmelding og flere oppsett."
     
    833894msgid "Spelhubben"
    834895msgstr "Spelhubben"
     896
     897#~ msgid "Basic example (legacy)"
     898#~ msgstr "Grunnleggende eksempel (eldre)"
     899
     900#~ msgid "Compact with map & animation (legacy)"
     901#~ msgstr "Kompakt med kart og animasjon (eldre versjon)"
     902
     903#~ msgid "Inline without map (legacy)"
     904#~ msgstr "Innebygd uten kart (eldre versjon)"
     905
     906#~ msgid "Detailed with daily forecast & all providers (legacy)"
     907#~ msgstr "Detaljert med daglig prognose og alle leverandører (eldre)"
     908
     909#~ msgid "Only temperature + wind, no map (legacy)"
     910#~ msgstr "Kun temperatur + vind, ikke noe kart (eldre)"
     911
     912#~ msgid "new"
     913#~ msgstr "ny"
     914
     915#~ msgid "Legacy shortcode examples (deprecated – will be removed soon)"
     916#~ msgstr "Eksempler på eldre kortkoder (utdatert – fjernes snart)"
     917
     918#~ msgid "legacy"
     919#~ msgstr "legacy"
  • spelhubben-weather/trunk/languages/spelhubben-weather-sv_SE-ef457c6fc9879530ccb874bec7a8e544.json

    r3372751 r3420396  
    1 {"translation-revision-date": "2025-10-04 09:31+0200", "generator": "Poedit 3.7", "source": "blocks/spelhubben-weather/index.js", "domain": "messages", "locale_data": {"messages": {"": {"domain": "messages", "lang": "sv_SE", "plural-forms": "nplurals=2; plural=(n != 1);"}, "Map height (px)": ["Karth\u00f6jd (px)"], "Units & format": ["Enheter och format"], "Preset": ["F\u00f6rinst\u00e4lla"], "e.g. Stockholm": ["t.ex. Stockholm"], "Metric (\u00b0C, m/s, mm)": ["Metrisk (\u00b0C, m/s, mm)"], "Metric (\u00b0C, km/h, mm)": ["Metrisk (\u00b0C, km/h, mm)"], "Imperial (\u00b0F, mph, in)": ["Imperial (\u00b0F, mph, in)"], "Forecast": ["Prognos"], "Location": ["Plats"], "Display": ["Visa"], "Inline": ["Inline"], "Compact": ["Kompakt"], "Card": ["Kort"], "Detailed": ["Detaljer"], "Place (name)": ["Ortnamn:"], "Coordinates override place when set.": ["Koordinater \u00e5sidos\u00e4tter plats n\u00e4r de \u00e4r inst\u00e4llda."], "Layout": ["Layout"], "Fields (comma-separated)": ["F\u00e4lt (kommaseparerade)"], "Show map": ["Visa karta"], "Animations": ["Animationer"], "Date format (PHP date)": ["Datumformat (PHP-datum)"], "Used for forecast labels (default: D j/n)": ["Anv\u00e4nds f\u00f6r prognosetiketter (standard: D j/n)"], "Type": ["Typ"], "None": ["Ingen"], "Daily": ["Dagligen"], "Days": ["Dagar"], "Spelhubben Weather preview (ServerSideRender unavailable). Save/update to view.": ["F\u00f6rhandsvisning av Spelhubbens v\u00e4der (ServerSideRender \u00e4r inte tillg\u00e4nglig). Spara/uppdatera f\u00f6r visning."]}}}
     1{"translation-revision-date": "2025-12-15 18:22+0100", "generator": "Poedit 3.8", "source": "blocks/spelhubben-weather/index.js", "domain": "messages", "locale_data": {"messages": {"": {"domain": "messages", "lang": "sv_SE", "plural-forms": "nplurals=2; plural=(n != 1);"}, "Map height (px)": ["Karth\u00f6jd (px)"], "Units & format": ["Enheter och format"], "Preset": ["F\u00f6rinst\u00e4lla"], "e.g. Stockholm": ["t.ex. Stockholm"], "Metric (\u00b0C, m/s, mm)": ["Metrisk (\u00b0C, m/s, mm)"], "Metric (\u00b0C, km/h, mm)": ["Metrisk (\u00b0C, km/h, mm)"], "Imperial (\u00b0F, mph, in)": ["Imperial (\u00b0F, mph, in)"], "Forecast": ["Prognos"], "Location": ["Plats"], "Display": ["Visa"], "Inline": ["Inline"], "Compact": ["Kompakt"], "Card": ["Kort"], "Detailed": ["Detaljer"], "Place (name)": ["Ortnamn:"], "Coordinates override place when set.": ["Koordinater \u00e5sidos\u00e4tter plats n\u00e4r de \u00e4r inst\u00e4llda."], "Layout": ["Layout"], "Fields (comma-separated)": ["F\u00e4lt (kommaseparerade)"], "Show map": ["Visa karta"], "Animations": ["Animationer"], "Date format (PHP date)": ["Datumformat (PHP-datum)"], "Used for forecast labels (default: D j/n)": ["Anv\u00e4nds f\u00f6r prognosetiketter (standard: D j/n)"], "Type": ["Typ"], "None": ["Ingen"], "Daily": ["Dagligen"], "Days": ["Dagar"], "Spelhubben Weather preview (ServerSideRender unavailable). Save/update to view.": ["F\u00f6rhandsvisning av Spelhubbens v\u00e4der (ServerSideRender \u00e4r inte tillg\u00e4nglig). Spara/uppdatera f\u00f6r visning."]}}}
  • spelhubben-weather/trunk/languages/spelhubben-weather-sv_SE.l10n.php

    r3372751 r3420396  
    11<?php
    22// generated by Poedit from spelhubben-weather-sv_SE.po, do not edit directly
    3 return ['domain'=>NULL,'plural-forms'=>'nplurals=2; plural=(n != 1);','language'=>'sv_SE','pot-creation-date'=>'2025-10-04 09:25+0200','po-revision-date'=>'2025-10-04 09:31+0200','translation-revision-date'=>'2025-10-04 09:31+0200','project-id-version'=>'Spelhubben Weather','x-generator'=>'Poedit 3.7','messages'=>['Copied!'=>'Kopierad!','Copy'=>'Kopiera','Expand'=>'Expandera','Collapse'=>'Kollapsa','Rendering…'=>'Genererar…','OK'=>'OK','Failed'=>'Misslyckades','Preview failed'=>'Förhandsgranskningen misslyckades','Spelhubben Weather'=>'Spelhubben Väder','Settings'=>'Inställningar','Shortcodes'=>'Kortkoder','Default settings'=>'Standardinställningar','Default place'=>'Standardplats','Cache TTL (minutes)'=>'Cache-TTL (minuter)','Default fields'=>'Standardfält','Default layout'=>'Standard Layout','Show map by default'=>'Visa karta som standard','Map height (px)'=>'Karthöjd (px)','Data providers'=>'Dataleverantörer','Yr contact/UA'=>'Yr contact/UA','Units & format'=>'Enheter och format','Preset'=>'Förinställa','Overrides (optional)'=>'Åsidosättningar (valfritt)','Date format (PHP)'=>'Datumformat (PHP)','e.g. Stockholm'=>'t.ex. Stockholm','How long weather data is cached (transients).'=>'Hur länge väderdata cachas (transienter).','Comma-separated: temp,wind,icon'=>'Kommaavgränsad: temp, vind, ikon','layout label' . "\4" . 'Inline'=>'Inline','layout label' . "\4" . 'Compact'=>'Kompakt','layout label' . "\4" . 'Card'=>'Kort','layout label' . "\4" . 'Detailed'=>'Detaljer','Enable map as default.'=>'Aktivera karta som standard.','Open-Meteo'=>'Open-Meteo','SMHI'=>'SMHI','Yr (MET Norway)'=>'Yr (MET Norway)','MET Norway Nowcast'=>'MET Norway Nowcast','Recommended by MET Norway: include an email or URL in your User-Agent.'=>'Rekommenderas av MET Norge: inkludera en e-postadress eller URL i din användaragent.','Metric (°C, m/s, mm)'=>'Metrisk (°C, m/s, mm)','Metric (°C, km/h, mm)'=>'Metrisk (°C, km/h, mm)','Imperial (°F, mph, in)'=>'Imperial (°F, mph, in)','Temp unit'=>'Temp-enhet','Wind unit'=>'Vindenhet','Precip unit'=>'Nederbördsenhet','Used for forecast day labels.'=>'Används för etiketter för prognosdagar.','Cache cleared.'=>'Cachen har rensats.','Spelhubben Weather – Settings'=>'Spelhubben Väder – Inställningar','Tune defaults, providers and formatting. Shortcodes now live on their own page.'=>'Justera standardinställningar, leverantörer och formatering. Kortkoder finns nu på en egen sida.','Clear cache (transients)'=>'Rensa cachen (transienter)','Open Shortcodes'=>'Öppna kortkoder','General'=>'Allmänt','Attribution'=>'Erkännande','License requirements'=>'Licenskrav','The attribution is locked to comply with OpenStreetMap/ODbL requirements.'=>'Attributionen är låst för att följa OpenStreetMap/ODbL-kraven.','Why locked?'=>'Varför låst?','To ensure proper crediting of data sources per ODbL and respective API policies.'=>'För att säkerställa korrekt kreditering av datakällor enligt ODbL och respektive API-policyer.','Tips'=>'Tips','Use the Shortcodes page to quickly copy examples and see supported attributes.'=>'Använd sidan Kortkoder för att snabbt kopiera exempel och se vilka attribut som stöds.','Shortcode'=>'Kortkod','Forecast'=>'Prognos','Leaflet map'=>'Broschyrkarta','Basic example'=>'Grundläggande exempel','Compact with map & animation'=>'Kompakt med karta och animation','Inline without map'=>'Inline utan karta','Detailed with daily forecast & km/h'=>'Detaljerad med daglig prognos och km/h','Only temperature + wind, imperial'=>'Endast temperatur + vind, imperial','Basic example (legacy)'=>'Grundläggande exempel (äldre)','Compact with map & animation (legacy)'=>'Kompakt med karta och animation (äldre version)','Inline without map (legacy)'=>'Inline utan karta (äldre version)','Detailed with daily forecast & all providers (legacy)'=>'Detaljerad med daglig prognos och alla leverantörer (äldre)','Only temperature + wind, no map (legacy)'=>'Endast temperatur + vind, ingen karta (äldre)','Spelhubben Weather – Shortcodes'=>'Spelhubben Väder – Kortkoder','Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your clipboard.'=>'Kopiera och klistra in färdiga utdrag. Klicka på "Kopiera" för att lägga till en kortkod i urklipp.','Back to Settings'=>'Tillbaka till inställningar','Search examples… e.g. inline, map, imperial'=>'Sökexempel… t.ex. inline, map, imperial','Copy all (visible)'=>'Kopiera alla (synliga)','Quick start – shortcodes'=>'Snabbstart – kortkoder','new'=>'ny','Legacy shortcode examples (deprecated – will be removed soon)'=>'Exempel på äldre shortcode-koder (föråldrade – kommer att tas bort snart)','legacy'=>'legacy','Preview'=>'Förhandsvisning','Click a snippet to send it here. You can edit, copy or expand the box.'=>'Klicka på ett utdrag för att skicka det hit. Du kan redigera, kopiera eller expandera rutan.','Clear'=>'Klart','Shortcode preview'=>'Förhandsvisning av kortkod','Live preview'=>'Live-förhandsvisning','Shortcode live preview'=>'Förhandsvisning av kortkod i realtid','Attributes – overview'=>'Attribut – översikt','Location'=>'Plats','Display'=>'Visa','Attribute'=>'Attribut','Description'=>'Beskrivning','Example'=>'Exempel','Place name to geocode (used if lat/lon are missing).'=>'Ortsnamn att geokoda (används om latitud/longitud saknas).','Coordinates take precedence over place.'=>'Koordinater har företräde framför plats.','Fields to display: temp,wind,icon'=>'Fält att visa: temp, vind, ikon','inline | compact | card | detailed'=>'inline | kompakt | kort | detaljerad','1/0 to show/hide map'=>'1/0 för att visa/dölja kartan','Map height in px (min 120).'=>'Karthöjd i px (minst 120).','openmeteo,smhi,yr,metno_nowcast (comma-separated)'=>'openmeteo,smhi,yr,metno_nowcast (kommaseparerad)','1/0 – subtle animations'=>'1/0 – subtila animationer','none | daily'=>'ingen | dagligen','Number of days in the forecast (3–10)'=>'Antal dagar i prognosen (3–10)','Preset: metric | metric_kmh | imperial'=>'Förinställning: metrisk | metrisk_kmh | brittisk','Override temperature unit'=>'Överstyrningstemperaturenhet','Override wind unit'=>'Åsidosätt vindenheten','Override precipitation unit'=>'Åsidosätt nederbördsenhet','Forecast date label (PHP date)'=>'Prognosdatumetikett (PHP-datum)','Inline'=>'Inline','Compact'=>'Kompakt','Card'=>'Kort','Detailed'=>'Detaljer','Place (name)'=>'Ortnamn:','Coordinates override place when set.'=>'Koordinater åsidosätter plats när de är inställda.','Layout'=>'Layout','Fields (comma-separated)'=>'Fält (kommaseparerade)','Show map'=>'Visa karta','Animations'=>'Animationer','Date format (PHP date)'=>'Datumformat (PHP-datum)','Used for forecast labels (default: D j/n)'=>'Används för prognosetiketter (standard: D j/n)','Type'=>'Typ','None'=>'Ingen','Daily'=>'Dagligen','Days'=>'Dagar','Spelhubben Weather preview (ServerSideRender unavailable). Save/update to view.'=>'Förhandsvisning av Spelhubbens väder (ServerSideRender är inte tillgänglig). Spara/uppdatera för visning.','Display current weather with an optional forecast.'=>'Visa aktuellt väder med en valfri prognos.','Could not load %s.'=>'Kunde inte ladda %s.','Title:'=>'Titel:','Place (name):'=>'Ortnamn:','Coordinates (optional):'=>'Koordinater (valfritt):','Show:'=>'Visa:','Choose which parts to display in the widget.'=>'Välj vilka delar som ska visas i widgeten.','Layout:'=>'Layout:','Map height (px):'=>'Karthöjd (px):','Forecast:'=>'Prognos:','Number of days (1–14):'=>'Antal dagar (1–14):','Extra CSS class:'=>'Extra CSS-klass:','Spelhubben Weather (legacy)'=>'Spelhubben Väder (äldre)','Wind %s %s'=>'Vind %s %s','Wind: %s %s'=>'Vind: %s %s','Precipitation: %s %s'=>'Nederbörd: %s %s','Cloud cover: %s%%'=>'Molntäcke: %s%%','View on OpenStreetMap'=>'Visa på OpenStreetMap','Could not fetch weather data from the selected providers.'=>'Kunde inte hämta väderdata från de valda leverantörerna.','Could not find the place.'=>'Kunde inte hitta platsen.','Mostly clear'=>'Mestadels klart','Partly cloudy'=>'Delvis molnigt','Overcast'=>'Mulet','Fog'=>'Dimma','Freezing fog'=>'Frusen dimma','Light drizzle'=>'Lätt duggregn','Moderate drizzle'=>'Måttligt duggregn','Dense drizzle'=>'Tät duggregn','Light rain'=>'Lätt regn','Moderate rain'=>'Måttligt regn','Heavy rain'=>'Mycket regn','Light freezing rain'=>'Lätt underkylt regn','Heavy freezing rain'=>'Kraftigt underkylt regn','Light snowfall'=>'Lätt snöfall','Moderate snowfall'=>'Måttlig snöfall','Heavy snowfall'=>'Kraftigt snöfall','Snow grains'=>'Snökorn','Light rain showers'=>'Lätta regnskurar','Moderate rain showers'=>'Måttliga regnskurar','Violent rain showers'=>'Våldsamma regnskurar','Light snow showers'=>'Lätta snöbyar','Heavy snow showers'=>'Kraftiga snöbyar','Thunderstorm'=>'Åskväder','Thunderstorm (slight hail)'=>'Åska (lätt hagel)','Thunderstorm (heavy hail)'=>'Åska (kraftig hagel)','Clear sky'=>'Klar himmel','Depositing rime fog'=>'Avsättning av rimdimma','Drizzle: light'=>'Duggregn: lätt','Drizzle: moderate'=>'Duggregn: måttligt','Drizzle: dense'=>'Duggregn: tätt','Rain: light'=>'Regn: lätt','Rain: moderate'=>'Regn: måttligt','Rain: heavy'=>'Regn: kraftigt','Freezing rain: light'=>'Underkylt regn: lätt','Freezing rain: heavy'=>'Underkylt regn: kraftigt','Snowfall: light'=>'Snöfall: lätt','Snowfall: moderate'=>'Snöfall: måttlig','Snowfall: heavy'=>'Snöfall: kraftigt','Rain showers: slight'=>'Regnskurar: lätta','Rain showers: moderate'=>'Regnskurar: måttliga','Rain showers: violent'=>'Regnskurar: våldsamma','Snow showers: slight'=>'Snöbyar: lätta','Snow showers: heavy'=>'Snöbyar: kraftiga','Thunderstorm with slight hail'=>'Åska med lätt hagel','Thunderstorm with heavy hail'=>'Åskväder med kraftig hagel','Precipitation'=>'Nederbörd','Displays current weather and an optional forecast with a simple consensus across providers (Open-Meteo, SMHI, Yr/MET Norway). Supports shortcode + Gutenberg block + classic widget. Optional Leaflet map, subtle animations, daily forecast, and multiple layouts.'=>'Visar aktuellt väder och en valfri prognos med en enkel konsensus mellan leverantörer (Open-Meteo, SMHI, Yr/MET Norge). Stöder shortcode + Gutenberg-block + klassisk widget. Valfri broschyrkarta, diskreta animationer, daglig prognos och flera layouter.','Spelhubben'=>'Spelhubben']];
     3return ['domain'=>NULL,'plural-forms'=>'nplurals=2; plural=(n != 1);','language'=>'sv_SE','pot-creation-date'=>'2025-12-15 18:19+0100','po-revision-date'=>'2025-12-15 18:22+0100','translation-revision-date'=>'2025-12-15 18:22+0100','project-id-version'=>'Spelhubben Weather','x-generator'=>'Poedit 3.8','messages'=>['Copied!'=>'Kopierad!','Copy'=>'Kopiera','Expand'=>'Expandera','Collapse'=>'Kollapsa','Rendering…'=>'Genererar…','OK'=>'OK','Failed'=>'Misslyckades','Preview failed'=>'Förhandsgranskningen misslyckades','Spelhubben Weather'=>'Spelhubben Väder','Settings'=>'Inställningar','Shortcodes'=>'Kortkoder','Default settings'=>'Standardinställningar','Default place'=>'Standardplats','Cache TTL (minutes)'=>'Cache-TTL (minuter)','Default fields'=>'Standardfält','Default layout'=>'Standard Layout','Show map by default'=>'Visa karta som standard','Map height (px)'=>'Karthöjd (px)','Icon style'=>'Ikonstil','Data providers'=>'Dataleverantörer','Yr contact/UA'=>'Yr contact/UA','Units & format'=>'Enheter och format','Preset'=>'Förinställa','Overrides (optional)'=>'Åsidosättningar (valfritt)','Date format (PHP)'=>'Datumformat (PHP)','e.g. Stockholm'=>'t.ex. Stockholm','How long weather data is cached (transients).'=>'Hur länge väderdata cachas (transienter).','Comma-separated: temp,wind,icon'=>'Kommaavgränsad: temp, vind, ikon','layout label' . "\4" . 'Inline'=>'Inline','layout label' . "\4" . 'Compact'=>'Kompakt','layout label' . "\4" . 'Card'=>'Kort','layout label' . "\4" . 'Detailed'=>'Detaljer','Enable map as default.'=>'Aktivera karta som standard.','Classic'=>'Klassisk','Modern Flat'=>'Modern platt','Modern Gradient'=>'Modern gradient','Choose your preferred weather icon theme.'=>'Välj ditt föredragna tema för väderikoner.','Open-Meteo'=>'Open-Meteo','SMHI'=>'SMHI','Yr (MET Norway)'=>'Yr (MET Norway)','MET Norway Nowcast'=>'MET Norway Nowcast','FMI (Finland, Open Data)'=>'FMI (Finland, Open Data)','Open-Weathermap'=>'Open-Weathermap','Weatherapi.com'=>'Weatherapi.com','Recommended by MET Norway: include an email or URL in your User-Agent.'=>'Rekommenderas av MET Norge: inkludera en e-postadress eller URL i din användaragent.','Metric (°C, m/s, mm)'=>'Metrisk (°C, m/s, mm)','Metric (°C, km/h, mm)'=>'Metrisk (°C, km/h, mm)','Imperial (°F, mph, in)'=>'Imperial (°F, mph, in)','Temp unit'=>'Temp-enhet','Wind unit'=>'Vindenhet','Precip unit'=>'Nederbördsenhet','Used for forecast day labels.'=>'Används för etiketter för prognosdagar.','Cache cleared.'=>'Cachen har rensats.','Spelhubben Weather – Settings'=>'Spelhubben Väder – Inställningar','Tune defaults, providers and formatting. Shortcodes now live on their own page.'=>'Justera standardinställningar, leverantörer och formatering. Kortkoder finns nu på en egen sida.','Clear cache (transients)'=>'Rensa cachen (transienter)','Open Shortcodes'=>'Öppna kortkoder','General'=>'Allmänt','Attribution'=>'Erkännande','License requirements'=>'Licenskrav','The attribution is locked to comply with OpenStreetMap/ODbL requirements.'=>'Attributionen är låst för att följa OpenStreetMap/ODbL-kraven.','Why locked?'=>'Varför låst?','To ensure proper crediting of data sources per ODbL and respective API policies.'=>'För att säkerställa korrekt kreditering av datakällor enligt ODbL och respektive API-policyer.','Tips'=>'Tips','Use the Shortcodes page to quickly copy examples and see supported attributes.'=>'Använd sidan Kortkoder för att snabbt kopiera exempel och se vilka attribut som stöds.','Shortcode'=>'Kortkod','Forecast'=>'Prognos','Leaflet map'=>'Broschyrkarta','Basic example'=>'Grundläggande exempel','Compact with map & animation'=>'Kompakt med karta och animation','Inline without map'=>'Inline utan karta','Detailed with daily forecast & km/h'=>'Detaljerad med daglig prognos och km/h','Only temperature + wind, imperial'=>'Endast temperatur + vind, imperial','Spelhubben Weather – Shortcodes'=>'Spelhubben Väder – Kortkoder','Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your clipboard.'=>'Kopiera och klistra in färdiga utdrag. Klicka på "Kopiera" för att lägga till en kortkod i urklipp.','Back to Settings'=>'Tillbaka till inställningar','Search examples… e.g. inline, map, imperial'=>'Sökexempel… t.ex. inline, map, imperial','Copy all (visible)'=>'Kopiera alla (synliga)','Quick start – shortcodes'=>'Snabbstart – kortkoder','Preview'=>'Förhandsvisning','Click a snippet to send it here. You can edit, copy or expand the box.'=>'Klicka på ett utdrag för att skicka det hit. Du kan redigera, kopiera eller expandera rutan.','Clear'=>'Klart','Shortcode preview'=>'Förhandsvisning av kortkod','Live preview'=>'Live-förhandsvisning','Shortcode live preview'=>'Förhandsvisning av kortkod i realtid','Attributes – overview'=>'Attribut – översikt','Location'=>'Plats','Display'=>'Visa','Attribute'=>'Attribut','Description'=>'Beskrivning','Example'=>'Exempel','Place name to geocode (used if lat/lon are missing).'=>'Ortsnamn att geokoda (används om latitud/longitud saknas).','Coordinates take precedence over place.'=>'Koordinater har företräde framför plats.','Fields to display: temp,wind,icon'=>'Fält att visa: temp, vind, ikon','inline | compact | card | detailed'=>'inline | kompakt | kort | detaljerad','1/0 to show/hide map'=>'1/0 för att visa/dölja kartan','Map height in px (min 120).'=>'Karthöjd i px (minst 120).','openmeteo,smhi,yr,metno_nowcast (comma-separated)'=>'openmeteo,smhi,yr,metno_nowcast (kommaseparerad)','1/0 – subtle animations'=>'1/0 – subtila animationer','none | daily'=>'ingen | dagligen','Number of days in the forecast (3–10)'=>'Antal dagar i prognosen (3–10)','Preset: metric | metric_kmh | imperial'=>'Förinställning: metrisk | metrisk_kmh | brittisk','Override temperature unit'=>'Överstyrningstemperaturenhet','Override wind unit'=>'Åsidosätt vindenheten','Override precipitation unit'=>'Åsidosätt nederbördsenhet','Forecast date label (PHP date)'=>'Prognosdatumetikett (PHP-datum)','Inline'=>'Inline','Compact'=>'Kompakt','Card'=>'Kort','Detailed'=>'Detaljer','Place (name)'=>'Ortnamn:','Coordinates override place when set.'=>'Koordinater åsidosätter plats när de är inställda.','Layout'=>'Layout','Fields (comma-separated)'=>'Fält (kommaseparerade)','Show map'=>'Visa karta','Animations'=>'Animationer','Date format (PHP date)'=>'Datumformat (PHP-datum)','Used for forecast labels (default: D j/n)'=>'Används för prognosetiketter (standard: D j/n)','Type'=>'Typ','None'=>'Ingen','Daily'=>'Dagligen','Days'=>'Dagar','Spelhubben Weather preview (ServerSideRender unavailable). Save/update to view.'=>'Förhandsvisning av Spelhubbens väder (ServerSideRender är inte tillgänglig). Spara/uppdatera för visning.','Display current weather with an optional forecast.'=>'Visa aktuellt väder med en valfri prognos.','Could not load %s.'=>'Kunde inte ladda %s.','Title:'=>'Titel:','Place (name):'=>'Ortnamn:','Coordinates (optional):'=>'Koordinater (valfritt):','Show:'=>'Visa:','Choose which parts to display in the widget.'=>'Välj vilka delar som ska visas i widgeten.','Layout:'=>'Layout:','Map height (px):'=>'Karthöjd (px):','Forecast:'=>'Prognos:','Number of days (1–14):'=>'Antal dagar (1–14):','Extra CSS class:'=>'Extra CSS-klass:','Spelhubben Weather (legacy)'=>'Spelhubben Väder (äldre)','Wind %1$s %2$s'=>'Vind %1$s %2$s','Wind: %1$s %2$s'=>'Vind: %1$s %2$s','Precipitation: %1$s %2$s'=>'Nederbörd: %1$s %2$s','Cloud cover: %s%%'=>'Molntäcke: %s%%','View on OpenStreetMap'=>'Visa på OpenStreetMap','Provider Comparison'=>'Leverantörsjämförelse','sources'=>'källor','Note:'=>'Notera:','Each provider may report different values due to different measuring stations or calculation methods. Use this view to compare accuracy and availability.'=>'Varje leverantör kan rapportera olika värden på grund av olika mätstationer eller beräkningsmetoder. Använd den här vyn för att jämföra noggrannhet och tillgänglighet.','Could not fetch weather data from the selected providers.'=>'Kunde inte hämta väderdata från de valda leverantörerna.','Could not find the place.'=>'Kunde inte hitta platsen.','Could not fetch plugin list right now.'=>'Kunde inte hämta plugin-listan just nu.','Retry'=>'Försöka igen','No other plugins found.'=>'Inga andra plugin-program hittades.','Other plugins by Spelhubben:'=>'Andra plugins från Spelhubben:','Details'=>'Detaljer','WP.org'=>'WP.org','Active:'=>'Aktiv:','Tested:'=>'Testad:','Unknown'=>'Okänd','Mostly clear'=>'Mestadels klart','Partly cloudy'=>'Delvis molnigt','Overcast'=>'Mulet','Fog'=>'Dimma','Freezing fog'=>'Frusen dimma','Light drizzle'=>'Lätt duggregn','Moderate drizzle'=>'Måttligt duggregn','Dense drizzle'=>'Tät duggregn','Light rain'=>'Lätt regn','Moderate rain'=>'Måttligt regn','Heavy rain'=>'Mycket regn','Light freezing rain'=>'Lätt underkylt regn','Heavy freezing rain'=>'Kraftigt underkylt regn','Light snowfall'=>'Lätt snöfall','Moderate snowfall'=>'Måttlig snöfall','Heavy snowfall'=>'Kraftigt snöfall','Snow grains'=>'Snökorn','Light rain showers'=>'Lätta regnskurar','Moderate rain showers'=>'Måttliga regnskurar','Violent rain showers'=>'Våldsamma regnskurar','Light snow showers'=>'Lätta snöbyar','Heavy snow showers'=>'Kraftiga snöbyar','Thunderstorm'=>'Åskväder','Thunderstorm (slight hail)'=>'Åska (lätt hagel)','Thunderstorm (heavy hail)'=>'Åska (kraftig hagel)','Clear sky'=>'Klar himmel','Depositing rime fog'=>'Avsättning av rimdimma','Drizzle: light'=>'Duggregn: lätt','Drizzle: moderate'=>'Duggregn: måttligt','Drizzle: dense'=>'Duggregn: tätt','Rain: light'=>'Regn: lätt','Rain: moderate'=>'Regn: måttligt','Rain: heavy'=>'Regn: kraftigt','Freezing rain: light'=>'Underkylt regn: lätt','Freezing rain: heavy'=>'Underkylt regn: kraftigt','Snowfall: light'=>'Snöfall: lätt','Snowfall: moderate'=>'Snöfall: måttlig','Snowfall: heavy'=>'Snöfall: kraftigt','Rain showers: slight'=>'Regnskurar: lätta','Rain showers: moderate'=>'Regnskurar: måttliga','Rain showers: violent'=>'Regnskurar: våldsamma','Snow showers: slight'=>'Snöbyar: lätta','Snow showers: heavy'=>'Snöbyar: kraftiga','Thunderstorm with slight hail'=>'Åska med lätt hagel','Thunderstorm with heavy hail'=>'Åskväder med kraftig hagel','Precipitation'=>'Nederbörd','Displays current weather and an optional forecast with a simple consensus across providers (Open-Meteo, SMHI, Yr/MET Norway). Supports shortcode + Gutenberg block + classic widget. Optional Leaflet map, subtle animations, daily forecast, and multiple layouts.'=>'Visar aktuellt väder och en valfri prognos med en enkel konsensus mellan leverantörer (Open-Meteo, SMHI, Yr/MET Norge). Stöder shortcode + Gutenberg-block + klassisk widget. Valfri broschyrkarta, diskreta animationer, daglig prognos och flera layouter.','Spelhubben'=>'Spelhubben']];
  • spelhubben-weather/trunk/languages/spelhubben-weather-sv_SE.po

    r3372751 r3420396  
    22msgstr ""
    33"Project-Id-Version: Spelhubben Weather\n"
    4 "POT-Creation-Date: 2025-10-04 09:25+0200\n"
    5 "PO-Revision-Date: 2025-10-04 09:31+0200\n"
     4"POT-Creation-Date: 2025-12-15 18:19+0100\n"
     5"PO-Revision-Date: 2025-12-15 18:22+0100\n"
    66"Last-Translator: \n"
    77"Language-Team: \n"
     
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "X-Generator: Poedit 3.7\n"
     12"X-Generator: Poedit 3.8\n"
    1313"X-Poedit-Basepath: ..\n"
    1414"X-Poedit-Flags-xgettext: --add-comments=translators:\n"
     
    2121"X-Poedit-SearchPathExcluded-1: assets/vendor\n"
    2222
    23 #: admin/admin.php:49
     23#: admin/admin.php:55
    2424msgid "Copied!"
    2525msgstr "Kopierad!"
    2626
    27 #: admin/admin.php:50 admin/page-shortcodes.php:85
    28 #: admin/page-shortcodes.php:108 admin/page-shortcodes.php:134
     27#: admin/admin.php:56 admin/page-shortcodes.php:68 admin/page-shortcodes.php:93
    2928msgid "Copy"
    3029msgstr "Kopiera"
    3130
    32 #: admin/admin.php:51 admin/page-shortcodes.php:140
     31#: admin/admin.php:57 admin/page-shortcodes.php:99
    3332msgid "Expand"
    3433msgstr "Expandera"
    3534
    36 #: admin/admin.php:52
     35#: admin/admin.php:58
    3736msgid "Collapse"
    3837msgstr "Kollapsa"
    3938
    40 #: admin/admin.php:53
     39#: admin/admin.php:59
    4140msgid "Rendering…"
    4241msgstr "Genererar…"
    4342
    44 #: admin/admin.php:54
     43#: admin/admin.php:60
    4544msgid "OK"
    4645msgstr "OK"
    4746
    48 #: admin/admin.php:55
     47#: admin/admin.php:61
    4948msgid "Failed"
    5049msgstr "Misslyckades"
    5150
    52 #: admin/admin.php:56
     51#: admin/admin.php:62
    5352msgid "Preview failed"
    5453msgstr "Förhandsgranskningen misslyckades"
    5554
    5655#. Plugin Name of the plugin/theme
    57 #: admin/admin.php:87 admin/admin.php:88 includes/Widget/class-widget.php:19
     56#: admin/admin.php:93 admin/admin.php:94 includes/Widget/class-widget.php:19
    5857msgid "Spelhubben Weather"
    5958msgstr "Spelhubben Väder"
    6059
    61 #: admin/admin.php:99 admin/admin.php:100 includes/class-plugin.php:114
     60#: admin/admin.php:105 admin/admin.php:106 includes/class-plugin.php:104
    6261msgid "Settings"
    6362msgstr "Inställningar"
    6463
    65 #: admin/admin.php:109 admin/admin.php:110
     64#: admin/admin.php:115 admin/admin.php:116
    6665msgid "Shortcodes"
    6766msgstr "Kortkoder"
    6867
    69 #: admin/admin.php:132 admin/page-settings.php:44
     68#: admin/admin.php:138 admin/page-settings.php:44
    7069msgid "Default settings"
    7170msgstr "Standardinställningar"
    7271
    73 #: admin/admin.php:134
     72#: admin/admin.php:140
    7473msgid "Default place"
    7574msgstr "Standardplats"
    7675
    77 #: admin/admin.php:135
     76#: admin/admin.php:141
    7877msgid "Cache TTL (minutes)"
    7978msgstr "Cache-TTL (minuter)"
    8079
    81 #: admin/admin.php:136
     80#: admin/admin.php:142
    8281msgid "Default fields"
    8382msgstr "Standardfält"
    8483
    85 #: admin/admin.php:137
     84#: admin/admin.php:143
    8685msgid "Default layout"
    8786msgstr "Standard Layout"
    8887
    89 #: admin/admin.php:138
     88#: admin/admin.php:144
    9089msgid "Show map by default"
    9190msgstr "Visa karta som standard"
    9291
    93 #: admin/admin.php:139 blocks/spelhubben-weather/index.js:59
     92#: admin/admin.php:145 blocks/spelhubben-weather/index.js:59
    9493msgid "Map height (px)"
    9594msgstr "Karthöjd (px)"
    9695
    97 #: admin/admin.php:140
     96#: admin/admin.php:146
     97msgid "Icon style"
     98msgstr "Ikonstil"
     99
     100#: admin/admin.php:147
    98101msgid "Data providers"
    99102msgstr "Dataleverantörer"
    100103
    101 #: admin/admin.php:141
     104#: admin/admin.php:148
    102105msgid "Yr contact/UA"
    103106msgstr "Yr contact/UA"
    104107
    105 #: admin/admin.php:144 admin/page-shortcodes.php:166
     108#: admin/admin.php:151 admin/page-shortcodes.php:125
    106109#: blocks/spelhubben-weather/index.js:68
    107110msgid "Units & format"
    108111msgstr "Enheter och format"
    109112
    110 #: admin/admin.php:145 blocks/spelhubben-weather/index.js:70
     113#: admin/admin.php:152 blocks/spelhubben-weather/index.js:70
    111114msgid "Preset"
    112115msgstr "Förinställa"
    113116
    114 #: admin/admin.php:146
     117#: admin/admin.php:153
    115118msgid "Overrides (optional)"
    116119msgstr "Åsidosättningar (valfritt)"
    117120
    118 #: admin/admin.php:147
     121#: admin/admin.php:154
    119122msgid "Date format (PHP)"
    120123msgstr "Datumformat (PHP)"
    121124
    122 #: admin/admin.php:157 blocks/spelhubben-weather/index.js:36
     125#: admin/admin.php:164 blocks/spelhubben-weather/index.js:36
    123126msgid "e.g. Stockholm"
    124127msgstr "t.ex. Stockholm"
    125128
    126 #: admin/admin.php:171
     129#: admin/admin.php:178
    127130msgid "How long weather data is cached (transients)."
    128131msgstr "Hur länge väderdata cachas (transienter)."
    129132
    130 #: admin/admin.php:180
     133#: admin/admin.php:187
    131134msgid "Comma-separated: temp,wind,icon"
    132135msgstr "Kommaavgränsad: temp, vind, ikon"
    133136
    134 #: admin/admin.php:186
     137#: admin/admin.php:193
    135138msgctxt "layout label"
    136139msgid "Inline"
    137140msgstr "Inline"
    138141
    139 #: admin/admin.php:187
     142#: admin/admin.php:194
    140143msgctxt "layout label"
    141144msgid "Compact"
    142145msgstr "Kompakt"
    143146
    144 #: admin/admin.php:188
     147#: admin/admin.php:195
    145148msgctxt "layout label"
    146149msgid "Card"
    147150msgstr "Kort"
    148151
    149 #: admin/admin.php:189
     152#: admin/admin.php:196
    150153msgctxt "layout label"
    151154msgid "Detailed"
    152155msgstr "Detaljer"
    153156
    154 #: admin/admin.php:208
     157#: admin/admin.php:215
    155158msgid "Enable map as default."
    156159msgstr "Aktivera karta som standard."
    157160
    158 #: admin/admin.php:225
     161#: admin/admin.php:230
     162msgid "Classic"
     163msgstr "Klassisk"
     164
     165#: admin/admin.php:231
     166msgid "Modern Flat"
     167msgstr "Modern platt"
     168
     169#: admin/admin.php:232
     170msgid "Modern Gradient"
     171msgstr "Modern gradient"
     172
     173#: admin/admin.php:244
     174msgid "Choose your preferred weather icon theme."
     175msgstr "Välj ditt föredragna tema för väderikoner."
     176
     177#: admin/admin.php:252
    159178msgid "Open-Meteo"
    160179msgstr "Open-Meteo"
    161180
    162 #: admin/admin.php:230
     181#: admin/admin.php:257
    163182msgid "SMHI"
    164183msgstr "SMHI"
    165184
    166 #: admin/admin.php:235
     185#: admin/admin.php:262
    167186msgid "Yr (MET Norway)"
    168187msgstr "Yr (MET Norway)"
    169188
    170 #: admin/admin.php:240
     189#: admin/admin.php:267
    171190msgid "MET Norway Nowcast"
    172191msgstr "MET Norway Nowcast"
    173192
    174 #: admin/admin.php:250
     193#: admin/admin.php:273
     194msgid "FMI (Finland, Open Data)"
     195msgstr "FMI (Finland, Open Data)"
     196
     197#: admin/admin.php:278
     198msgid "Open-Weathermap"
     199msgstr "Open-Weathermap"
     200
     201#: admin/admin.php:283
     202msgid "Weatherapi.com"
     203msgstr "Weatherapi.com"
     204
     205#: admin/admin.php:293
    175206msgid "Recommended by MET Norway: include an email or URL in your User-Agent."
    176207msgstr ""
     
    178209"användaragent."
    179210
    180 #: admin/admin.php:256 blocks/spelhubben-weather/index.js:16
     211#: admin/admin.php:299 blocks/spelhubben-weather/index.js:16
    181212msgid "Metric (°C, m/s, mm)"
    182213msgstr "Metrisk (°C, m/s, mm)"
    183214
    184 #: admin/admin.php:257 blocks/spelhubben-weather/index.js:17
     215#: admin/admin.php:300 blocks/spelhubben-weather/index.js:17
    185216msgid "Metric (°C, km/h, mm)"
    186217msgstr "Metrisk (°C, km/h, mm)"
    187218
    188 #: admin/admin.php:258 blocks/spelhubben-weather/index.js:18
     219#: admin/admin.php:301 blocks/spelhubben-weather/index.js:18
    189220msgid "Imperial (°F, mph, in)"
    190221msgstr "Imperial (°F, mph, in)"
    191222
    192 #: admin/admin.php:276
     223#: admin/admin.php:319
    193224msgid "Temp unit"
    194225msgstr "Temp-enhet"
    195226
    196 #: admin/admin.php:281
     227#: admin/admin.php:324
    197228msgid "Wind unit"
    198229msgstr "Vindenhet"
    199230
    200 #: admin/admin.php:286
     231#: admin/admin.php:329
    201232msgid "Precip unit"
    202233msgstr "Nederbördsenhet"
    203234
    204 #: admin/admin.php:297
     235#: admin/admin.php:340
    205236msgid "Used for forecast day labels."
    206237msgstr "Används för etiketter för prognosdagar."
     
    275306msgstr "Kortkod"
    276307
    277 #: admin/page-settings.php:91 admin/page-shortcodes.php:165
     308#: admin/page-settings.php:91 admin/page-shortcodes.php:124
    278309#: blocks/spelhubben-weather/index.js:84
    279310msgid "Forecast"
     
    284315msgstr "Broschyrkarta"
    285316
    286 #: admin/page-shortcodes.php:27
     317#: admin/page-shortcodes.php:20
    287318msgid "Basic example"
    288319msgstr "Grundläggande exempel"
    289320
    290 #: admin/page-shortcodes.php:28
     321#: admin/page-shortcodes.php:21
    291322msgid "Compact with map & animation"
    292323msgstr "Kompakt med karta och animation"
    293324
    294 #: admin/page-shortcodes.php:29
     325#: admin/page-shortcodes.php:22
    295326msgid "Inline without map"
    296327msgstr "Inline utan karta"
    297328
    298 #: admin/page-shortcodes.php:30
     329#: admin/page-shortcodes.php:23
    299330msgid "Detailed with daily forecast & km/h"
    300331msgstr "Detaljerad med daglig prognos och km/h"
    301332
    302 #: admin/page-shortcodes.php:31
     333#: admin/page-shortcodes.php:24
    303334msgid "Only temperature + wind, imperial"
    304335msgstr "Endast temperatur + vind, imperial"
    305336
    306 #: admin/page-shortcodes.php:35
    307 msgid "Basic example (legacy)"
    308 msgstr "Grundläggande exempel (äldre)"
    309 
    310 #: admin/page-shortcodes.php:36
    311 msgid "Compact with map & animation (legacy)"
    312 msgstr "Kompakt med karta och animation (äldre version)"
    313 
    314 #: admin/page-shortcodes.php:37
    315 msgid "Inline without map (legacy)"
    316 msgstr "Inline utan karta (äldre version)"
    317 
    318 #: admin/page-shortcodes.php:38
    319 msgid "Detailed with daily forecast & all providers (legacy)"
    320 msgstr "Detaljerad med daglig prognos och alla leverantörer (äldre)"
    321 
    322 #: admin/page-shortcodes.php:39
    323 msgid "Only temperature + wind, no map (legacy)"
    324 msgstr "Endast temperatur + vind, ingen karta (äldre)"
    325 
    326 #: admin/page-shortcodes.php:43
     337#: admin/page-shortcodes.php:28
    327338msgid "Spelhubben Weather – Shortcodes"
    328339msgstr "Spelhubben Väder – Kortkoder"
    329340
    330 #: admin/page-shortcodes.php:44
     341#: admin/page-shortcodes.php:29
    331342msgid ""
    332343"Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your "
     
    336347"till en kortkod i urklipp."
    337348
    338 #: admin/page-shortcodes.php:50 admin/page-shortcodes.php:204
     349#: admin/page-shortcodes.php:35 admin/page-shortcodes.php:163
    339350msgid "Back to Settings"
    340351msgstr "Tillbaka till inställningar"
    341352
    342 #: admin/page-shortcodes.php:55
     353#: admin/page-shortcodes.php:40
    343354msgid "Search examples… e.g. inline, map, imperial"
    344355msgstr "Sökexempel… t.ex. inline, map, imperial"
    345356
    346 #: admin/page-shortcodes.php:61
     357#: admin/page-shortcodes.php:46
    347358msgid "Copy all (visible)"
    348359msgstr "Kopiera alla (synliga)"
    349360
    350 #: admin/page-shortcodes.php:71
     361#: admin/page-shortcodes.php:56
    351362msgid "Quick start – shortcodes"
    352363msgstr "Snabbstart – kortkoder"
    353364
    354 #: admin/page-shortcodes.php:82
    355 msgid "new"
    356 msgstr "ny"
    357 
    358 #: admin/page-shortcodes.php:95
    359 msgid "Legacy shortcode examples (deprecated – will be removed soon)"
    360 msgstr ""
    361 "Exempel på äldre shortcode-koder (föråldrade – kommer att tas bort snart)"
    362 
    363 #: admin/page-shortcodes.php:105
    364 msgid "legacy"
    365 msgstr "legacy"
    366 
    367 #: admin/page-shortcodes.php:126
     365#: admin/page-shortcodes.php:85
    368366msgid "Preview"
    369367msgstr "Förhandsvisning"
    370368
    371 #: admin/page-shortcodes.php:129
     369#: admin/page-shortcodes.php:88
    372370msgid "Click a snippet to send it here. You can edit, copy or expand the box."
    373371msgstr ""
     
    375373"expandera rutan."
    376374
    377 #: admin/page-shortcodes.php:137 includes/i18n.php:47
     375#: admin/page-shortcodes.php:96 includes/i18n.php:47
    378376msgid "Clear"
    379377msgstr "Klart"
    380378
    381 #: admin/page-shortcodes.php:144
     379#: admin/page-shortcodes.php:103
    382380msgid "Shortcode preview"
    383381msgstr "Förhandsvisning av kortkod"
    384382
    385 #: admin/page-shortcodes.php:148
     383#: admin/page-shortcodes.php:107
    386384msgid "Live preview"
    387385msgstr "Live-förhandsvisning"
    388386
    389 #: admin/page-shortcodes.php:152
     387#: admin/page-shortcodes.php:111
    390388msgid "Shortcode live preview"
    391389msgstr "Förhandsvisning av kortkod i realtid"
    392390
    393 #: admin/page-shortcodes.php:159
     391#: admin/page-shortcodes.php:118
    394392msgid "Attributes – overview"
    395393msgstr "Attribut – översikt"
    396394
    397 #: admin/page-shortcodes.php:163 blocks/spelhubben-weather/index.js:31
     395#: admin/page-shortcodes.php:122 blocks/spelhubben-weather/index.js:31
    398396msgid "Location"
    399397msgstr "Plats"
    400398
    401 #: admin/page-shortcodes.php:164 blocks/spelhubben-weather/index.js:43
     399#: admin/page-shortcodes.php:123 blocks/spelhubben-weather/index.js:43
    402400msgid "Display"
    403401msgstr "Visa"
    404402
    405 #: admin/page-shortcodes.php:173
     403#: admin/page-shortcodes.php:132
    406404msgid "Attribute"
    407405msgstr "Attribut"
    408406
    409 #: admin/page-shortcodes.php:174
     407#: admin/page-shortcodes.php:133
    410408msgid "Description"
    411409msgstr "Beskrivning"
    412410
    413 #: admin/page-shortcodes.php:175
     411#: admin/page-shortcodes.php:134
    414412msgid "Example"
    415413msgstr "Exempel"
    416414
    417 #: admin/page-shortcodes.php:179
     415#: admin/page-shortcodes.php:138
    418416msgid "Place name to geocode (used if lat/lon are missing)."
    419417msgstr "Ortsnamn att geokoda (används om latitud/longitud saknas)."
    420418
    421 #: admin/page-shortcodes.php:180
     419#: admin/page-shortcodes.php:139
    422420msgid "Coordinates take precedence over place."
    423421msgstr "Koordinater har företräde framför plats."
    424422
    425 #: admin/page-shortcodes.php:182
     423#: admin/page-shortcodes.php:141
    426424msgid "Fields to display: temp,wind,icon"
    427425msgstr "Fält att visa: temp, vind, ikon"
    428426
    429 #: admin/page-shortcodes.php:183
     427#: admin/page-shortcodes.php:142
    430428msgid "inline | compact | card | detailed"
    431429msgstr "inline | kompakt | kort | detaljerad"
    432430
    433 #: admin/page-shortcodes.php:184
     431#: admin/page-shortcodes.php:143
    434432msgid "1/0 to show/hide map"
    435433msgstr "1/0 för att visa/dölja kartan"
    436434
    437 #: admin/page-shortcodes.php:185
     435#: admin/page-shortcodes.php:144
    438436msgid "Map height in px (min 120)."
    439437msgstr "Karthöjd i px (minst 120)."
    440438
    441 #: admin/page-shortcodes.php:186
     439#: admin/page-shortcodes.php:145
    442440msgid "openmeteo,smhi,yr,metno_nowcast (comma-separated)"
    443441msgstr "openmeteo,smhi,yr,metno_nowcast (kommaseparerad)"
    444442
    445 #: admin/page-shortcodes.php:187
     443#: admin/page-shortcodes.php:146
    446444msgid "1/0 – subtle animations"
    447445msgstr "1/0 – subtila animationer"
    448446
    449 #: admin/page-shortcodes.php:189
     447#: admin/page-shortcodes.php:148
    450448msgid "none | daily"
    451449msgstr "ingen | dagligen"
    452450
    453 #: admin/page-shortcodes.php:190
     451#: admin/page-shortcodes.php:149
    454452msgid "Number of days in the forecast (3–10)"
    455453msgstr "Antal dagar i prognosen (3–10)"
    456454
    457 #: admin/page-shortcodes.php:192
     455#: admin/page-shortcodes.php:151
    458456msgid "Preset: metric | metric_kmh | imperial"
    459457msgstr "Förinställning: metrisk | metrisk_kmh | brittisk"
    460458
    461 #: admin/page-shortcodes.php:193
     459#: admin/page-shortcodes.php:152
    462460msgid "Override temperature unit"
    463461msgstr "Överstyrningstemperaturenhet"
    464462
    465 #: admin/page-shortcodes.php:194
     463#: admin/page-shortcodes.php:153
    466464msgid "Override wind unit"
    467465msgstr "Åsidosätt vindenheten"
    468466
    469 #: admin/page-shortcodes.php:195
     467#: admin/page-shortcodes.php:154
    470468msgid "Override precipitation unit"
    471469msgstr "Åsidosätt nederbördsenhet"
    472470
    473 #: admin/page-shortcodes.php:196
     471#: admin/page-shortcodes.php:155
    474472msgid "Forecast date label (PHP date)"
    475473msgstr "Prognosdatumetikett (PHP-datum)"
     
    601599msgstr "Spelhubben Väder (äldre)"
    602600
    603 #: includes/class-renderer.php:109
     601#. translators: 1: wind value, 2: wind unit (e.g. 5, km/h)
     602#: includes/class-renderer.php:123
    604603#, php-format
    605 msgid "Wind %s %s"
    606 msgstr "Vind %s %s"
    607 
    608 #: includes/class-renderer.php:128 includes/class-renderer.php:159
     604msgid "Wind %1$s %2$s"
     605msgstr "Vind %1$s %2$s"
     606
     607#. translators: 1: wind value, 2: wind unit (e.g. 5, km/h)
     608#: includes/class-renderer.php:146 includes/class-renderer.php:189
    609609#, php-format
    610 msgid "Wind: %s %s"
    611 msgstr "Vind: %s %s"
    612 
    613 #: includes/class-renderer.php:136
     610msgid "Wind: %1$s %2$s"
     611msgstr "Vind: %1$s %2$s"
     612
     613#. translators: 1: precipitation value, 2: precipitation unit (e.g. 1.2, mm)
     614#: includes/class-renderer.php:158
    614615#, php-format
    615 msgid "Precipitation: %s %s"
    616 msgstr "Nederbörd: %s %s"
    617 
    618 #: includes/class-renderer.php:139
     616msgid "Precipitation: %1$s %2$s"
     617msgstr "Nederbörd: %1$s %2$s"
     618
     619#. translators: %s: cloud cover percent (0–100)
     620#: includes/class-renderer.php:165
    619621#, php-format
    620622msgid "Cloud cover: %s%%"
    621623msgstr "Molntäcke: %s%%"
    622624
    623 #: includes/class-renderer.php:178
     625#: includes/class-renderer.php:211
    624626msgid "View on OpenStreetMap"
    625627msgstr "Visa på OpenStreetMap"
    626628
    627 #: includes/class-sv-vader.php:53
     629#: includes/class-renderer.php:269
     630msgid "Provider Comparison"
     631msgstr "Leverantörsjämförelse"
     632
     633#: includes/class-renderer.php:269
     634msgid "sources"
     635msgstr "källor"
     636
     637#: includes/class-renderer.php:317
     638msgid "Note:"
     639msgstr "Notera:"
     640
     641#: includes/class-renderer.php:318
     642msgid ""
     643"Each provider may report different values due to different measuring "
     644"stations or calculation methods. Use this view to compare accuracy and "
     645"availability."
     646msgstr ""
     647"Varje leverantör kan rapportera olika värden på grund av olika mätstationer "
     648"eller beräkningsmetoder. Använd den här vyn för att jämföra noggrannhet och "
     649"tillgänglighet."
     650
     651#: includes/class-sv-vader.php:65
    628652msgid "Could not fetch weather data from the selected providers."
    629653msgstr "Kunde inte hämta väderdata från de valda leverantörerna."
    630654
    631 #: includes/class-sv-vader.php:106
     655#: includes/class-sv-vader.php:188
    632656msgid "Could not find the place."
    633657msgstr "Kunde inte hitta platsen."
    634658
    635 #: includes/i18n.php:48 includes/providers.php:125
     659#: includes/class-wporg-plugins.php:189
     660msgid "Could not fetch plugin list right now."
     661msgstr "Kunde inte hämta plugin-listan just nu."
     662
     663#: includes/class-wporg-plugins.php:194
     664msgid "Retry"
     665msgstr "Försöka igen"
     666
     667#: includes/class-wporg-plugins.php:200
     668msgid "No other plugins found."
     669msgstr "Inga andra plugin-program hittades."
     670
     671#: includes/class-wporg-plugins.php:223
     672msgid "Other plugins by Spelhubben:"
     673msgstr "Andra plugins från Spelhubben:"
     674
     675#: includes/class-wporg-plugins.php:281
     676msgid "Details"
     677msgstr "Detaljer"
     678
     679#: includes/class-wporg-plugins.php:282
     680msgid "WP.org"
     681msgstr "WP.org"
     682
     683#: includes/class-wporg-plugins.php:309
     684msgid "Active:"
     685msgstr "Aktiv:"
     686
     687#: includes/class-wporg-plugins.php:314
     688msgid "Tested:"
     689msgstr "Testad:"
     690
     691#: includes/class-wporg-plugins.php:315
     692msgid "Unknown"
     693msgstr "Okänd"
     694
     695#: includes/i18n.php:48 includes/providers.php:248
    636696msgid "Mostly clear"
    637697msgstr "Mestadels klart"
    638698
    639 #: includes/i18n.php:49 includes/providers.php:126 includes/providers.php:196
     699#: includes/i18n.php:49 includes/providers.php:249 includes/providers.php:319
    640700msgid "Partly cloudy"
    641701msgstr "Delvis molnigt"
    642702
    643 #: includes/i18n.php:50 includes/providers.php:127 includes/providers.php:198
     703#: includes/i18n.php:50 includes/providers.php:250 includes/providers.php:321
    644704msgid "Overcast"
    645705msgstr "Mulet"
    646706
    647 #: includes/i18n.php:51 includes/providers.php:128
     707#: includes/i18n.php:51 includes/providers.php:251
    648708msgid "Fog"
    649709msgstr "Dimma"
     
    697757msgstr "Kraftigt snöfall"
    698758
    699 #: includes/i18n.php:64 includes/providers.php:141
     759#: includes/i18n.php:64 includes/providers.php:264
    700760msgid "Snow grains"
    701761msgstr "Snökorn"
     
    721781msgstr "Kraftiga snöbyar"
    722782
    723 #: includes/i18n.php:70 includes/providers.php:147
     783#: includes/i18n.php:70 includes/providers.php:270
    724784msgid "Thunderstorm"
    725785msgstr "Åskväder"
     
    733793msgstr "Åska (kraftig hagel)"
    734794
    735 #: includes/providers.php:124 includes/providers.php:194
     795#: includes/providers.php:247 includes/providers.php:317
    736796msgid "Clear sky"
    737797msgstr "Klar himmel"
    738798
    739 #: includes/providers.php:129
     799#: includes/providers.php:252
    740800msgid "Depositing rime fog"
    741801msgstr "Avsättning av rimdimma"
    742802
    743 #: includes/providers.php:130
     803#: includes/providers.php:253
    744804msgid "Drizzle: light"
    745805msgstr "Duggregn: lätt"
    746806
    747 #: includes/providers.php:131
     807#: includes/providers.php:254
    748808msgid "Drizzle: moderate"
    749809msgstr "Duggregn: måttligt"
    750810
    751 #: includes/providers.php:132
     811#: includes/providers.php:255
    752812msgid "Drizzle: dense"
    753813msgstr "Duggregn: tätt"
    754814
    755 #: includes/providers.php:133
     815#: includes/providers.php:256
    756816msgid "Rain: light"
    757817msgstr "Regn: lätt"
    758818
    759 #: includes/providers.php:134
     819#: includes/providers.php:257
    760820msgid "Rain: moderate"
    761821msgstr "Regn: måttligt"
    762822
    763 #: includes/providers.php:135
     823#: includes/providers.php:258
    764824msgid "Rain: heavy"
    765825msgstr "Regn: kraftigt"
    766826
    767 #: includes/providers.php:136
     827#: includes/providers.php:259
    768828msgid "Freezing rain: light"
    769829msgstr "Underkylt regn: lätt"
    770830
    771 #: includes/providers.php:137
     831#: includes/providers.php:260
    772832msgid "Freezing rain: heavy"
    773833msgstr "Underkylt regn: kraftigt"
    774834
    775 #: includes/providers.php:138
     835#: includes/providers.php:261
    776836msgid "Snowfall: light"
    777837msgstr "Snöfall: lätt"
    778838
    779 #: includes/providers.php:139
     839#: includes/providers.php:262
    780840msgid "Snowfall: moderate"
    781841msgstr "Snöfall: måttlig"
    782842
    783 #: includes/providers.php:140
     843#: includes/providers.php:263
    784844msgid "Snowfall: heavy"
    785845msgstr "Snöfall: kraftigt"
    786846
    787 #: includes/providers.php:142
     847#: includes/providers.php:265
    788848msgid "Rain showers: slight"
    789849msgstr "Regnskurar: lätta"
    790850
    791 #: includes/providers.php:143
     851#: includes/providers.php:266
    792852msgid "Rain showers: moderate"
    793853msgstr "Regnskurar: måttliga"
    794854
    795 #: includes/providers.php:144
     855#: includes/providers.php:267
    796856msgid "Rain showers: violent"
    797857msgstr "Regnskurar: våldsamma"
    798858
    799 #: includes/providers.php:145
     859#: includes/providers.php:268
    800860msgid "Snow showers: slight"
    801861msgstr "Snöbyar: lätta"
    802862
    803 #: includes/providers.php:146
     863#: includes/providers.php:269
    804864msgid "Snow showers: heavy"
    805865msgstr "Snöbyar: kraftiga"
    806866
    807 #: includes/providers.php:148
     867#: includes/providers.php:271
    808868msgid "Thunderstorm with slight hail"
    809869msgstr "Åska med lätt hagel"
    810870
    811 #: includes/providers.php:149
     871#: includes/providers.php:272
    812872msgid "Thunderstorm with heavy hail"
    813873msgstr "Åskväder med kraftig hagel"
    814874
    815 #: includes/providers.php:191
     875#: includes/providers.php:314
    816876msgid "Precipitation"
    817877msgstr "Nederbörd"
     
    833893msgstr "Spelhubben"
    834894
     895#~ msgid "Basic example (legacy)"
     896#~ msgstr "Grundläggande exempel (äldre)"
     897
     898#~ msgid "Compact with map & animation (legacy)"
     899#~ msgstr "Kompakt med karta och animation (äldre version)"
     900
     901#~ msgid "Inline without map (legacy)"
     902#~ msgstr "Inline utan karta (äldre version)"
     903
     904#~ msgid "Detailed with daily forecast & all providers (legacy)"
     905#~ msgstr "Detaljerad med daglig prognos och alla leverantörer (äldre)"
     906
     907#~ msgid "Only temperature + wind, no map (legacy)"
     908#~ msgstr "Endast temperatur + vind, ingen karta (äldre)"
     909
     910#~ msgid "new"
     911#~ msgstr "ny"
     912
     913#~ msgid "Legacy shortcode examples (deprecated – will be removed soon)"
     914#~ msgstr ""
     915#~ "Exempel på äldre shortcode-koder (föråldrade – kommer att tas bort snart)"
     916
     917#~ msgid "legacy"
     918#~ msgstr "legacy"
     919
    835920#~ msgid "Custom CSS class on the wrapper"
    836921#~ msgstr "Anpassad CSS-klass på omslaget"
  • spelhubben-weather/trunk/languages/spelhubben-weather.pot

    r3372751 r3420396  
    33msgstr ""
    44"Project-Id-Version: Spelhubben Weather\n"
    5 "POT-Creation-Date: 2025-10-04 09:32+0200\n"
     5"POT-Creation-Date: 2025-12-15 18:17+0100\n"
    66"PO-Revision-Date: 2025-09-27 19:36+0200\n"
    77"Last-Translator: \n"
     
    1111"Content-Transfer-Encoding: 8bit\n"
    1212"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
    13 "X-Generator: Poedit 3.7\n"
     13"X-Generator: Poedit 3.8\n"
    1414"X-Poedit-Basepath: ..\n"
    1515"X-Poedit-Flags-xgettext: --add-comments=translators:\n"
     
    2222"X-Poedit-SearchPathExcluded-1: assets/vendor\n"
    2323
    24 #: admin/admin.php:49
     24#: admin/admin.php:55
    2525msgid "Copied!"
    2626msgstr ""
    2727
    28 #: admin/admin.php:50 admin/page-shortcodes.php:85
    29 #: admin/page-shortcodes.php:108 admin/page-shortcodes.php:134
     28#: admin/admin.php:56 admin/page-shortcodes.php:68
     29#: admin/page-shortcodes.php:93
    3030msgid "Copy"
    3131msgstr ""
    3232
    33 #: admin/admin.php:51 admin/page-shortcodes.php:140
     33#: admin/admin.php:57 admin/page-shortcodes.php:99
    3434msgid "Expand"
    3535msgstr ""
    3636
    37 #: admin/admin.php:52
     37#: admin/admin.php:58
    3838msgid "Collapse"
    3939msgstr ""
    4040
    41 #: admin/admin.php:53
     41#: admin/admin.php:59
    4242msgid "Rendering…"
    4343msgstr ""
    4444
    45 #: admin/admin.php:54
     45#: admin/admin.php:60
    4646msgid "OK"
    4747msgstr ""
    4848
    49 #: admin/admin.php:55
     49#: admin/admin.php:61
    5050msgid "Failed"
    5151msgstr ""
    5252
    53 #: admin/admin.php:56
     53#: admin/admin.php:62
    5454msgid "Preview failed"
    5555msgstr ""
    5656
    5757#. Plugin Name of the plugin/theme
    58 #: admin/admin.php:87 admin/admin.php:88 includes/Widget/class-widget.php:19
     58#: admin/admin.php:93 admin/admin.php:94 includes/Widget/class-widget.php:19
    5959msgid "Spelhubben Weather"
    6060msgstr ""
    6161
    62 #: admin/admin.php:99 admin/admin.php:100 includes/class-plugin.php:114
     62#: admin/admin.php:105 admin/admin.php:106 includes/class-plugin.php:104
    6363msgid "Settings"
    6464msgstr ""
    6565
    66 #: admin/admin.php:109 admin/admin.php:110
     66#: admin/admin.php:115 admin/admin.php:116
    6767msgid "Shortcodes"
    6868msgstr ""
    6969
    70 #: admin/admin.php:132 admin/page-settings.php:44
     70#: admin/admin.php:138 admin/page-settings.php:44
    7171msgid "Default settings"
    7272msgstr ""
    7373
    74 #: admin/admin.php:134
     74#: admin/admin.php:140
    7575msgid "Default place"
    7676msgstr ""
    7777
    78 #: admin/admin.php:135
     78#: admin/admin.php:141
    7979msgid "Cache TTL (minutes)"
    8080msgstr ""
    8181
    82 #: admin/admin.php:136
     82#: admin/admin.php:142
    8383msgid "Default fields"
    8484msgstr ""
    8585
    86 #: admin/admin.php:137
     86#: admin/admin.php:143
    8787msgid "Default layout"
    8888msgstr ""
    8989
    90 #: admin/admin.php:138
     90#: admin/admin.php:144
    9191msgid "Show map by default"
    9292msgstr ""
    9393
    94 #: admin/admin.php:139 blocks/spelhubben-weather/index.js:59
     94#: admin/admin.php:145 blocks/spelhubben-weather/index.js:59
    9595msgid "Map height (px)"
    9696msgstr ""
    9797
    98 #: admin/admin.php:140
     98#: admin/admin.php:146
     99msgid "Icon style"
     100msgstr ""
     101
     102#: admin/admin.php:147
    99103msgid "Data providers"
    100104msgstr ""
    101105
    102 #: admin/admin.php:141
     106#: admin/admin.php:148
    103107msgid "Yr contact/UA"
    104108msgstr ""
    105109
    106 #: admin/admin.php:144 admin/page-shortcodes.php:166
     110#: admin/admin.php:151 admin/page-shortcodes.php:125
    107111#: blocks/spelhubben-weather/index.js:68
    108112msgid "Units & format"
    109113msgstr ""
    110114
    111 #: admin/admin.php:145 blocks/spelhubben-weather/index.js:70
     115#: admin/admin.php:152 blocks/spelhubben-weather/index.js:70
    112116msgid "Preset"
    113117msgstr ""
    114118
    115 #: admin/admin.php:146
     119#: admin/admin.php:153
    116120msgid "Overrides (optional)"
    117121msgstr ""
    118122
    119 #: admin/admin.php:147
     123#: admin/admin.php:154
    120124msgid "Date format (PHP)"
    121125msgstr ""
    122126
    123 #: admin/admin.php:157 blocks/spelhubben-weather/index.js:36
     127#: admin/admin.php:164 blocks/spelhubben-weather/index.js:36
    124128msgid "e.g. Stockholm"
    125129msgstr ""
    126130
    127 #: admin/admin.php:171
     131#: admin/admin.php:178
    128132msgid "How long weather data is cached (transients)."
    129133msgstr ""
    130134
    131 #: admin/admin.php:180
     135#: admin/admin.php:187
    132136msgid "Comma-separated: temp,wind,icon"
    133137msgstr ""
    134138
    135 #: admin/admin.php:186
     139#: admin/admin.php:193
    136140msgctxt "layout label"
    137141msgid "Inline"
    138142msgstr ""
    139143
    140 #: admin/admin.php:187
     144#: admin/admin.php:194
    141145msgctxt "layout label"
    142146msgid "Compact"
    143147msgstr ""
    144148
    145 #: admin/admin.php:188
     149#: admin/admin.php:195
    146150msgctxt "layout label"
    147151msgid "Card"
    148152msgstr ""
    149153
    150 #: admin/admin.php:189
     154#: admin/admin.php:196
    151155msgctxt "layout label"
    152156msgid "Detailed"
    153157msgstr ""
    154158
    155 #: admin/admin.php:208
     159#: admin/admin.php:215
    156160msgid "Enable map as default."
    157161msgstr ""
    158162
    159 #: admin/admin.php:225
     163#: admin/admin.php:230
     164msgid "Classic"
     165msgstr ""
     166
     167#: admin/admin.php:231
     168msgid "Modern Flat"
     169msgstr ""
     170
     171#: admin/admin.php:232
     172msgid "Modern Gradient"
     173msgstr ""
     174
     175#: admin/admin.php:244
     176msgid "Choose your preferred weather icon theme."
     177msgstr ""
     178
     179#: admin/admin.php:252
    160180msgid "Open-Meteo"
    161181msgstr ""
    162182
    163 #: admin/admin.php:230
     183#: admin/admin.php:257
    164184msgid "SMHI"
    165185msgstr ""
    166186
    167 #: admin/admin.php:235
     187#: admin/admin.php:262
    168188msgid "Yr (MET Norway)"
    169189msgstr ""
    170190
    171 #: admin/admin.php:240
     191#: admin/admin.php:267
    172192msgid "MET Norway Nowcast"
    173193msgstr ""
    174194
    175 #: admin/admin.php:250
     195#: admin/admin.php:273
     196msgid "FMI (Finland, Open Data)"
     197msgstr ""
     198
     199#: admin/admin.php:278
     200msgid "Open-Weathermap"
     201msgstr ""
     202
     203#: admin/admin.php:283
     204msgid "Weatherapi.com"
     205msgstr ""
     206
     207#: admin/admin.php:293
    176208msgid "Recommended by MET Norway: include an email or URL in your User-Agent."
    177209msgstr ""
    178210
    179 #: admin/admin.php:256 blocks/spelhubben-weather/index.js:16
     211#: admin/admin.php:299 blocks/spelhubben-weather/index.js:16
    180212msgid "Metric (°C, m/s, mm)"
    181213msgstr ""
    182214
    183 #: admin/admin.php:257 blocks/spelhubben-weather/index.js:17
     215#: admin/admin.php:300 blocks/spelhubben-weather/index.js:17
    184216msgid "Metric (°C, km/h, mm)"
    185217msgstr ""
    186218
    187 #: admin/admin.php:258 blocks/spelhubben-weather/index.js:18
     219#: admin/admin.php:301 blocks/spelhubben-weather/index.js:18
    188220msgid "Imperial (°F, mph, in)"
    189221msgstr ""
    190222
    191 #: admin/admin.php:276
     223#: admin/admin.php:319
    192224msgid "Temp unit"
    193225msgstr ""
    194226
    195 #: admin/admin.php:281
     227#: admin/admin.php:324
    196228msgid "Wind unit"
    197229msgstr ""
    198230
    199 #: admin/admin.php:286
     231#: admin/admin.php:329
    200232msgid "Precip unit"
    201233msgstr ""
    202234
    203 #: admin/admin.php:297
     235#: admin/admin.php:340
    204236msgid "Used for forecast day labels."
    205237msgstr ""
     
    268300msgstr ""
    269301
    270 #: admin/page-settings.php:91 admin/page-shortcodes.php:165
     302#: admin/page-settings.php:91 admin/page-shortcodes.php:124
    271303#: blocks/spelhubben-weather/index.js:84
    272304msgid "Forecast"
     
    277309msgstr ""
    278310
    279 #: admin/page-shortcodes.php:27
     311#: admin/page-shortcodes.php:20
    280312msgid "Basic example"
    281313msgstr ""
    282314
     315#: admin/page-shortcodes.php:21
     316msgid "Compact with map & animation"
     317msgstr ""
     318
     319#: admin/page-shortcodes.php:22
     320msgid "Inline without map"
     321msgstr ""
     322
     323#: admin/page-shortcodes.php:23
     324msgid "Detailed with daily forecast & km/h"
     325msgstr ""
     326
     327#: admin/page-shortcodes.php:24
     328msgid "Only temperature + wind, imperial"
     329msgstr ""
     330
    283331#: admin/page-shortcodes.php:28
    284 msgid "Compact with map & animation"
     332msgid "Spelhubben Weather – Shortcodes"
    285333msgstr ""
    286334
    287335#: admin/page-shortcodes.php:29
    288 msgid "Inline without map"
    289 msgstr ""
    290 
    291 #: admin/page-shortcodes.php:30
    292 msgid "Detailed with daily forecast & km/h"
    293 msgstr ""
    294 
    295 #: admin/page-shortcodes.php:31
    296 msgid "Only temperature + wind, imperial"
    297 msgstr ""
    298 
    299 #: admin/page-shortcodes.php:35
    300 msgid "Basic example (legacy)"
    301 msgstr ""
    302 
    303 #: admin/page-shortcodes.php:36
    304 msgid "Compact with map & animation (legacy)"
    305 msgstr ""
    306 
    307 #: admin/page-shortcodes.php:37
    308 msgid "Inline without map (legacy)"
    309 msgstr ""
    310 
    311 #: admin/page-shortcodes.php:38
    312 msgid "Detailed with daily forecast & all providers (legacy)"
    313 msgstr ""
    314 
    315 #: admin/page-shortcodes.php:39
    316 msgid "Only temperature + wind, no map (legacy)"
    317 msgstr ""
    318 
    319 #: admin/page-shortcodes.php:43
    320 msgid "Spelhubben Weather – Shortcodes"
    321 msgstr ""
    322 
    323 #: admin/page-shortcodes.php:44
    324336msgid ""
    325337"Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your "
     
    327339msgstr ""
    328340
    329 #: admin/page-shortcodes.php:50 admin/page-shortcodes.php:204
     341#: admin/page-shortcodes.php:35 admin/page-shortcodes.php:163
    330342msgid "Back to Settings"
    331343msgstr ""
    332344
    333 #: admin/page-shortcodes.php:55
     345#: admin/page-shortcodes.php:40
    334346msgid "Search examples… e.g. inline, map, imperial"
    335347msgstr ""
    336348
    337 #: admin/page-shortcodes.php:61
     349#: admin/page-shortcodes.php:46
    338350msgid "Copy all (visible)"
    339351msgstr ""
    340352
    341 #: admin/page-shortcodes.php:71
     353#: admin/page-shortcodes.php:56
    342354msgid "Quick start – shortcodes"
    343355msgstr ""
    344356
    345 #: admin/page-shortcodes.php:82
    346 msgid "new"
    347 msgstr ""
    348 
    349 #: admin/page-shortcodes.php:95
    350 msgid "Legacy shortcode examples (deprecated – will be removed soon)"
    351 msgstr ""
    352 
    353 #: admin/page-shortcodes.php:105
    354 msgid "legacy"
    355 msgstr ""
    356 
    357 #: admin/page-shortcodes.php:126
     357#: admin/page-shortcodes.php:85
    358358msgid "Preview"
    359359msgstr ""
    360360
    361 #: admin/page-shortcodes.php:129
     361#: admin/page-shortcodes.php:88
    362362msgid "Click a snippet to send it here. You can edit, copy or expand the box."
    363363msgstr ""
    364364
    365 #: admin/page-shortcodes.php:137 includes/i18n.php:47
     365#: admin/page-shortcodes.php:96 includes/i18n.php:47
    366366msgid "Clear"
    367367msgstr ""
    368368
     369#: admin/page-shortcodes.php:103
     370msgid "Shortcode preview"
     371msgstr ""
     372
     373#: admin/page-shortcodes.php:107
     374msgid "Live preview"
     375msgstr ""
     376
     377#: admin/page-shortcodes.php:111
     378msgid "Shortcode live preview"
     379msgstr ""
     380
     381#: admin/page-shortcodes.php:118
     382msgid "Attributes – overview"
     383msgstr ""
     384
     385#: admin/page-shortcodes.php:122 blocks/spelhubben-weather/index.js:31
     386msgid "Location"
     387msgstr ""
     388
     389#: admin/page-shortcodes.php:123 blocks/spelhubben-weather/index.js:43
     390msgid "Display"
     391msgstr ""
     392
     393#: admin/page-shortcodes.php:132
     394msgid "Attribute"
     395msgstr ""
     396
     397#: admin/page-shortcodes.php:133
     398msgid "Description"
     399msgstr ""
     400
     401#: admin/page-shortcodes.php:134
     402msgid "Example"
     403msgstr ""
     404
     405#: admin/page-shortcodes.php:138
     406msgid "Place name to geocode (used if lat/lon are missing)."
     407msgstr ""
     408
     409#: admin/page-shortcodes.php:139
     410msgid "Coordinates take precedence over place."
     411msgstr ""
     412
     413#: admin/page-shortcodes.php:141
     414msgid "Fields to display: temp,wind,icon"
     415msgstr ""
     416
     417#: admin/page-shortcodes.php:142
     418msgid "inline | compact | card | detailed"
     419msgstr ""
     420
     421#: admin/page-shortcodes.php:143
     422msgid "1/0 to show/hide map"
     423msgstr ""
     424
    369425#: admin/page-shortcodes.php:144
    370 msgid "Shortcode preview"
     426msgid "Map height in px (min 120)."
     427msgstr ""
     428
     429#: admin/page-shortcodes.php:145
     430msgid "openmeteo,smhi,yr,metno_nowcast (comma-separated)"
     431msgstr ""
     432
     433#: admin/page-shortcodes.php:146
     434msgid "1/0 – subtle animations"
    371435msgstr ""
    372436
    373437#: admin/page-shortcodes.php:148
    374 msgid "Live preview"
     438msgid "none | daily"
     439msgstr ""
     440
     441#: admin/page-shortcodes.php:149
     442msgid "Number of days in the forecast (3–10)"
     443msgstr ""
     444
     445#: admin/page-shortcodes.php:151
     446msgid "Preset: metric | metric_kmh | imperial"
    375447msgstr ""
    376448
    377449#: admin/page-shortcodes.php:152
    378 msgid "Shortcode live preview"
    379 msgstr ""
    380 
    381 #: admin/page-shortcodes.php:159
    382 msgid "Attributes – overview"
    383 msgstr ""
    384 
    385 #: admin/page-shortcodes.php:163 blocks/spelhubben-weather/index.js:31
    386 msgid "Location"
    387 msgstr ""
    388 
    389 #: admin/page-shortcodes.php:164 blocks/spelhubben-weather/index.js:43
    390 msgid "Display"
    391 msgstr ""
    392 
    393 #: admin/page-shortcodes.php:173
    394 msgid "Attribute"
    395 msgstr ""
    396 
    397 #: admin/page-shortcodes.php:174
    398 msgid "Description"
    399 msgstr ""
    400 
    401 #: admin/page-shortcodes.php:175
    402 msgid "Example"
    403 msgstr ""
    404 
    405 #: admin/page-shortcodes.php:179
    406 msgid "Place name to geocode (used if lat/lon are missing)."
    407 msgstr ""
    408 
    409 #: admin/page-shortcodes.php:180
    410 msgid "Coordinates take precedence over place."
    411 msgstr ""
    412 
    413 #: admin/page-shortcodes.php:182
    414 msgid "Fields to display: temp,wind,icon"
    415 msgstr ""
    416 
    417 #: admin/page-shortcodes.php:183
    418 msgid "inline | compact | card | detailed"
    419 msgstr ""
    420 
    421 #: admin/page-shortcodes.php:184
    422 msgid "1/0 to show/hide map"
    423 msgstr ""
    424 
    425 #: admin/page-shortcodes.php:185
    426 msgid "Map height in px (min 120)."
    427 msgstr ""
    428 
    429 #: admin/page-shortcodes.php:186
    430 msgid "openmeteo,smhi,yr,metno_nowcast (comma-separated)"
    431 msgstr ""
    432 
    433 #: admin/page-shortcodes.php:187
    434 msgid "1/0 – subtle animations"
    435 msgstr ""
    436 
    437 #: admin/page-shortcodes.php:189
    438 msgid "none | daily"
    439 msgstr ""
    440 
    441 #: admin/page-shortcodes.php:190
    442 msgid "Number of days in the forecast (3–10)"
    443 msgstr ""
    444 
    445 #: admin/page-shortcodes.php:192
    446 msgid "Preset: metric | metric_kmh | imperial"
    447 msgstr ""
    448 
    449 #: admin/page-shortcodes.php:193
    450450msgid "Override temperature unit"
    451451msgstr ""
    452452
    453 #: admin/page-shortcodes.php:194
     453#: admin/page-shortcodes.php:153
    454454msgid "Override wind unit"
    455455msgstr ""
    456456
    457 #: admin/page-shortcodes.php:195
     457#: admin/page-shortcodes.php:154
    458458msgid "Override precipitation unit"
    459459msgstr ""
    460460
    461 #: admin/page-shortcodes.php:196
     461#: admin/page-shortcodes.php:155
    462462msgid "Forecast date label (PHP date)"
    463463msgstr ""
     
    587587msgstr ""
    588588
    589 #: includes/class-renderer.php:109
     589#. translators: 1: wind value, 2: wind unit (e.g. 5, km/h)
     590#: includes/class-renderer.php:123
    590591#, php-format
    591 msgid "Wind %s %s"
    592 msgstr ""
    593 
    594 #: includes/class-renderer.php:128 includes/class-renderer.php:159
     592msgid "Wind %1$s %2$s"
     593msgstr ""
     594
     595#. translators: 1: wind value, 2: wind unit (e.g. 5, km/h)
     596#: includes/class-renderer.php:146 includes/class-renderer.php:189
    595597#, php-format
    596 msgid "Wind: %s %s"
    597 msgstr ""
    598 
    599 #: includes/class-renderer.php:136
     598msgid "Wind: %1$s %2$s"
     599msgstr ""
     600
     601#. translators: 1: precipitation value, 2: precipitation unit (e.g. 1.2, mm)
     602#: includes/class-renderer.php:158
    600603#, php-format
    601 msgid "Precipitation: %s %s"
    602 msgstr ""
    603 
    604 #: includes/class-renderer.php:139
     604msgid "Precipitation: %1$s %2$s"
     605msgstr ""
     606
     607#. translators: %s: cloud cover percent (0–100)
     608#: includes/class-renderer.php:165
    605609#, php-format
    606610msgid "Cloud cover: %s%%"
    607611msgstr ""
    608612
    609 #: includes/class-renderer.php:178
     613#: includes/class-renderer.php:211
    610614msgid "View on OpenStreetMap"
    611615msgstr ""
    612616
    613 #: includes/class-sv-vader.php:53
     617#: includes/class-renderer.php:269
     618msgid "Provider Comparison"
     619msgstr ""
     620
     621#: includes/class-renderer.php:269
     622msgid "sources"
     623msgstr ""
     624
     625#: includes/class-renderer.php:317
     626msgid "Note:"
     627msgstr ""
     628
     629#: includes/class-renderer.php:318
     630msgid ""
     631"Each provider may report different values due to different measuring "
     632"stations or calculation methods. Use this view to compare accuracy and "
     633"availability."
     634msgstr ""
     635
     636#: includes/class-sv-vader.php:65
    614637msgid "Could not fetch weather data from the selected providers."
    615638msgstr ""
    616639
    617 #: includes/class-sv-vader.php:106
     640#: includes/class-sv-vader.php:188
    618641msgid "Could not find the place."
    619642msgstr ""
    620643
    621 #: includes/i18n.php:48 includes/providers.php:125
     644#: includes/class-wporg-plugins.php:189
     645msgid "Could not fetch plugin list right now."
     646msgstr ""
     647
     648#: includes/class-wporg-plugins.php:194
     649msgid "Retry"
     650msgstr ""
     651
     652#: includes/class-wporg-plugins.php:200
     653msgid "No other plugins found."
     654msgstr ""
     655
     656#: includes/class-wporg-plugins.php:223
     657msgid "Other plugins by Spelhubben:"
     658msgstr ""
     659
     660#: includes/class-wporg-plugins.php:281
     661msgid "Details"
     662msgstr ""
     663
     664#: includes/class-wporg-plugins.php:282
     665msgid "WP.org"
     666msgstr ""
     667
     668#: includes/class-wporg-plugins.php:309
     669msgid "Active:"
     670msgstr ""
     671
     672#: includes/class-wporg-plugins.php:314
     673msgid "Tested:"
     674msgstr ""
     675
     676#: includes/class-wporg-plugins.php:315
     677msgid "Unknown"
     678msgstr ""
     679
     680#: includes/i18n.php:48 includes/providers.php:248
    622681msgid "Mostly clear"
    623682msgstr ""
    624683
    625 #: includes/i18n.php:49 includes/providers.php:126 includes/providers.php:196
     684#: includes/i18n.php:49 includes/providers.php:249 includes/providers.php:319
    626685msgid "Partly cloudy"
    627686msgstr ""
    628687
    629 #: includes/i18n.php:50 includes/providers.php:127 includes/providers.php:198
     688#: includes/i18n.php:50 includes/providers.php:250 includes/providers.php:321
    630689msgid "Overcast"
    631690msgstr ""
    632691
    633 #: includes/i18n.php:51 includes/providers.php:128
     692#: includes/i18n.php:51 includes/providers.php:251
    634693msgid "Fog"
    635694msgstr ""
     
    683742msgstr ""
    684743
    685 #: includes/i18n.php:64 includes/providers.php:141
     744#: includes/i18n.php:64 includes/providers.php:264
    686745msgid "Snow grains"
    687746msgstr ""
     
    707766msgstr ""
    708767
    709 #: includes/i18n.php:70 includes/providers.php:147
     768#: includes/i18n.php:70 includes/providers.php:270
    710769msgid "Thunderstorm"
    711770msgstr ""
     
    719778msgstr ""
    720779
    721 #: includes/providers.php:124 includes/providers.php:194
     780#: includes/providers.php:247 includes/providers.php:317
    722781msgid "Clear sky"
    723782msgstr ""
    724783
    725 #: includes/providers.php:129
     784#: includes/providers.php:252
    726785msgid "Depositing rime fog"
    727786msgstr ""
    728787
    729 #: includes/providers.php:130
     788#: includes/providers.php:253
    730789msgid "Drizzle: light"
    731790msgstr ""
    732791
    733 #: includes/providers.php:131
     792#: includes/providers.php:254
    734793msgid "Drizzle: moderate"
    735794msgstr ""
    736795
    737 #: includes/providers.php:132
     796#: includes/providers.php:255
    738797msgid "Drizzle: dense"
    739798msgstr ""
    740799
    741 #: includes/providers.php:133
     800#: includes/providers.php:256
    742801msgid "Rain: light"
    743802msgstr ""
    744803
    745 #: includes/providers.php:134
     804#: includes/providers.php:257
    746805msgid "Rain: moderate"
    747806msgstr ""
    748807
    749 #: includes/providers.php:135
     808#: includes/providers.php:258
    750809msgid "Rain: heavy"
    751810msgstr ""
    752811
    753 #: includes/providers.php:136
     812#: includes/providers.php:259
    754813msgid "Freezing rain: light"
    755814msgstr ""
    756815
    757 #: includes/providers.php:137
     816#: includes/providers.php:260
    758817msgid "Freezing rain: heavy"
    759818msgstr ""
    760819
    761 #: includes/providers.php:138
     820#: includes/providers.php:261
    762821msgid "Snowfall: light"
    763822msgstr ""
    764823
    765 #: includes/providers.php:139
     824#: includes/providers.php:262
    766825msgid "Snowfall: moderate"
    767826msgstr ""
    768827
    769 #: includes/providers.php:140
     828#: includes/providers.php:263
    770829msgid "Snowfall: heavy"
    771830msgstr ""
    772831
    773 #: includes/providers.php:142
     832#: includes/providers.php:265
    774833msgid "Rain showers: slight"
    775834msgstr ""
    776835
    777 #: includes/providers.php:143
     836#: includes/providers.php:266
    778837msgid "Rain showers: moderate"
    779838msgstr ""
    780839
    781 #: includes/providers.php:144
     840#: includes/providers.php:267
    782841msgid "Rain showers: violent"
    783842msgstr ""
    784843
    785 #: includes/providers.php:145
     844#: includes/providers.php:268
    786845msgid "Snow showers: slight"
    787846msgstr ""
    788847
    789 #: includes/providers.php:146
     848#: includes/providers.php:269
    790849msgid "Snow showers: heavy"
    791850msgstr ""
    792851
    793 #: includes/providers.php:148
     852#: includes/providers.php:271
    794853msgid "Thunderstorm with slight hail"
    795854msgstr ""
    796855
    797 #: includes/providers.php:149
     856#: includes/providers.php:272
    798857msgid "Thunderstorm with heavy hail"
    799858msgstr ""
    800859
    801 #: includes/providers.php:191
     860#: includes/providers.php:314
    802861msgid "Precipitation"
    803862msgstr ""
  • spelhubben-weather/trunk/readme.txt

    r3408284 r3420396  
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 1.7.5
     7Stable tag: 1.8.1
    88Donate link: https://www.paypal.com/donate/?hosted_button_id=CV74CEXY5XEAU
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
    1111
    12 Weather widget & block with optional map and daily forecast. Can combine Open-Meteo, SMHI, Yr/MET and FMI data.
     12Weather widget & block with optional map and daily forecast. Can combine Open-Meteo, SMHI, Yr/MET, FMI, Open-Weathermap, and Weatherapi.com data.
    1313
    1414== Description ==
    15 This plugin displays current weather and an optional forecast. It can aggregate data from northern-Europe friendly providers (Open-Meteo, SMHI, Yr/MET Norway, and **FMI** / Finnish Meteorological Institute) and compute a simple consensus.
     15This plugin displays current weather and an optional forecast. It can aggregate data from free global weather providers (Open-Meteo, SMHI, Yr/MET Norway, FMI, Open-Weathermap, and Weatherapi.com) and compute a simple consensus. Works worldwide with excellent coverage in Europe and beyond.
    1616
    1717**Features**
     
    7070= How do layouts work? =
    7171Choose `layout="inline|compact|card|detailed"`. “Detailed” supports the multi-day forecast row.
     72= Can I see individual provider data (for comparison)? =
     73Yes! Use `comparison="1"` to show all enabled providers' data side-by-side. Useful for debugging or comparing which providers are available in your location.
     74Example: `[spelhubben_weather place="Stockholm" comparison="1" providers="openmeteo,smhi,yr,fmi,openweathermap,weatherapi"]`
     75
     76= What icon themes are available? =
     77Three themes: **Classic** (traditional), **Modern Flat** (clean, minimalist), and **Modern Gradient** (contemporary with gradients). Choose in **Settings → Spelhubben Weather → Icon style**. All themes include icons for sun, partly-cloudy, cloud, fog, rain, sleet, snow, and thunderstorm.
    7278
    7379= How do I enable the map and set its size? =
     
    104110- Rate limiting: reduce refreshes or increase cache TTL.
    105111
    106 = Legacy shortcode? =
    107 `[sv_vader …]` is still accepted for compatibility, but **deprecated** and will be removed soon. Please switch to `[spelhubben_weather …]`.
    108112
    109113== Screenshots ==
     
    113117
    114118== Changelog ==
     119= 1.8.1 =
     120- **New:** 3 selectable icon themes: **Classic**, **Modern Flat**, and **Modern Gradient** (set in Settings → Icon style).
     121- **Performance:** Optimized icon rendering with static variable caching for icon style preference (reduces repeated `sv_vader_get_options()` calls).
     122- **Tech:** Added private helper method `build_icon_url()` to centralize icon URL logic and improve maintainability.
     123- All icon themes include: sun, partly-cloudy, cloud, fog, rain, sleet, snow, thunderstorm (8 distinct weather conditions per theme).
     124- Updated README and readme.txt with icon theme documentation and admin settings guide.
     125
     126= 1.8.0 =
     127- **BREAKING CHANGE:** Removed legacy `[sv_vader …]` shortcode. Use `[spelhubben_weather …]` exclusively.
     128- **New Providers:** Added **Open-Weathermap** and **Weatherapi.com** for better global coverage (6 total providers).
     129- **New Feature:** `comparison="1"` attribute shows all providers' data side-by-side for easy comparison and debugging.
     130- **Performance:** Fixed memory leak in map.js (persistent MutationObserver, proper ResizeObserver cleanup).
     131- **Performance:** Added 7-day transient caching for geocoding lookups to reduce external API calls.
     132- **Performance:** CSS containment (`contain: layout style paint`) optimizes rendering on pages with multiple weather cards.
     133- **Caching:** Improved debounce function to prevent race conditions during window resizes.
     134- **Security:** Fixed unsafe XML parsing in FMI provider (now uses `LIBXML_NOCDATA` flag with proper error handling).
     135- **Feature:** New **plugin showcase** on settings page displaying other Spelhubben plugins (grid layout, auto-fetches from WordPress.org).
     136- **UX:** Plugin showcase auto-excludes Spelhubben Weather itself to avoid redundancy.
     137- Tested up to: WordPress 6.8+
     138
    115139= 1.7.5 =
    116140- Tested up to: 6.9
     
    137161
    138162== Upgrade Notice ==
     163= 1.8.0 =
     164**BREAKING CHANGE:** Legacy `[sv_vader …]` shortcode has been removed. Please migrate all shortcodes to use `[spelhubben_weather …]` format. Performance update with security fixes, geocoding caching, and new plugin showcase feature. Strongly recommended.
     165
    139166= 1.7.5 =
    140167Adds **FMI** as an optional free provider. Enable it under **Settings → Spelhubben Weather → Providers**, or pass `providers="smhi,yr,openmeteo,fmi"` in blocks/shortcodes/widgets.
  • spelhubben-weather/trunk/spelhubben-weather.php

    r3384734 r3420396  
    33 * Plugin Name: Spelhubben Weather
    44 * Description: Displays current weather and an optional forecast with a simple consensus across providers (Open-Meteo, SMHI, Yr/MET Norway). Supports shortcode + Gutenberg block + classic widget. Optional Leaflet map, subtle animations, daily forecast, and multiple layouts.
    5  * Version: 1.7.5
     5 * Version: 1.8.1
    66 * Author: Spelhubben
    77 * Text Domain: spelhubben-weather
     
    1919// ── Constants (kept for backward compatibility).
    2020if ( ! defined( 'SV_VADER_VER' ) ) {
    21     define( 'SV_VADER_VER', '1.7.5' );
     21    define( 'SV_VADER_VER', '1.8.1' );
    2222}
    2323if ( ! defined( 'SV_VADER_DIR' ) ) {
     
    5959require_once SV_VADER_DIR . 'includes/options.php';
    6060require_once SV_VADER_DIR . 'includes/format.php';         // NEW: Units & formatting helpers
     61require_once SV_VADER_DIR . 'includes/class-wporg-plugins.php'; // WP.org plugin showcase
    6162require_once SV_VADER_DIR . 'includes/class-sv-vader.php'; // API/service layer.
    6263
    6364if ( is_admin() ) {
    64     $admin = SV_VADER_DIR . 'admin/admin.php';
    65     if ( file_exists( $admin ) ) {
    66         require_once $admin;
     65    $sv_vader_admin = SV_VADER_DIR . 'admin/admin.php';
     66    if ( file_exists( $sv_vader_admin ) ) {
     67        require_once $sv_vader_admin;
    6768    }
    6869}
    6970
    7071// ── Widget (namespaced or classic).
    71 $widget_file = SV_VADER_DIR . 'includes/Widget/class-widget.php';
    72 if ( file_exists( $widget_file ) ) {
    73     require_once $widget_file;
     72$sv_vader_widget_file = SV_VADER_DIR . 'includes/Widget/class-widget.php';
     73if ( file_exists( $sv_vader_widget_file ) ) {
     74    require_once $sv_vader_widget_file;
    7475}
    7576
  • spelhubben-weather/trunk/uninstall.php

    r3372751 r3420396  
    1717 *    Prefer API deletes to avoid raw SQL.
    1818 */
    19 $option_keys = array(
     19$sv_vader_option_keys = array(
    2020    // Legacy
    2121    'sv_vader_options',
     
    2727);
    2828
    29 foreach ( $option_keys as $key ) {
    30     delete_option( $key );
    31     delete_site_option( $key );
     29foreach ( $sv_vader_option_keys as $sv_vader_key ) {
     30    delete_option( $sv_vader_key );
     31    delete_site_option( $sv_vader_key );
    3232}
    3333
     
    3636 *    These are safe API calls.
    3737 */
    38 $transient_keys = array(
     38$sv_vader_transient_keys = array(
    3939    'sv_vader_forecast_cache',
    4040    'spelhubben_weather_forecast_cache',
    4141);
    42 foreach ( $transient_keys as $t ) {
    43     delete_transient( $t );
    44     delete_site_transient( $t );
     42foreach ( $sv_vader_transient_keys as $sv_vader_t ) {
     43    delete_transient( $sv_vader_t );
     44    delete_site_transient( $sv_vader_t );
    4545}
    4646
     
    5959
    6060// Raw prefixes (without %). We'll escape with esc_like() and add '%'.
    61 $option_prefixes = array(
     61$sv_vader_option_prefixes = array(
    6262    // Legacy
    6363    'sv_vader_',
     
    7474
    7575// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
    76 foreach ( $option_prefixes as $raw_prefix ) {
    77     $like = $wpdb->esc_like( $raw_prefix ) . '%';
     76foreach ( $sv_vader_option_prefixes as $sv_vader_raw_prefix ) {
     77    $sv_vader_like = $wpdb->esc_like( $sv_vader_raw_prefix ) . '%';
    7878
    7979    // Allowed table-property interpolation ($wpdb->options) + prepared LIKE.
     
    8181        $wpdb->prepare(
    8282            "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s",
    83             $like
     83            $sv_vader_like
    8484        )
    8585    );
     
    9494// Multisite: sitemeta transients/prefixes + option-like keys
    9595if ( is_multisite() && ! empty( $wpdb->sitemeta ) ) {
    96     $site_prefixes = array(
     96    $sv_vader_site_prefixes = array(
    9797        '_site_transient_sv_vader_',
    9898        '_site_transient_timeout_sv_vader_',
     
    106106    );
    107107
    108     foreach ( $site_prefixes as $raw_prefix ) {
    109         $like = $wpdb->esc_like( $raw_prefix ) . '%';
     108    foreach ( $sv_vader_site_prefixes as $sv_vader_raw_prefix ) {
     109        $sv_vader_like = $wpdb->esc_like( $sv_vader_raw_prefix ) . '%';
    110110
    111111        // Allowed table-property interpolation ($wpdb->sitemeta) + prepared LIKE.
    112         $meta_keys = $wpdb->get_col(
     112        $sv_vader_meta_keys = $wpdb->get_col(
    113113            $wpdb->prepare(
    114114                "SELECT meta_key FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s",
    115                 $like
     115                $sv_vader_like
    116116            )
    117117        );
    118118
    119         if ( $meta_keys ) {
    120             foreach ( $meta_keys as $meta_key ) {
     119        if ( $sv_vader_meta_keys ) {
     120            foreach ( $sv_vader_meta_keys as $sv_vader_meta_key ) {
    121121                // Works for *_site_transient_* and site options keys.
    122                 delete_site_option( $meta_key );
     122                delete_site_option( $sv_vader_meta_key );
    123123            }
    124124        }
     
    131131 */
    132132if ( function_exists( '_get_cron_array' ) ) {
    133     $prefixes = array(
     133    $sv_vader_prefixes = array(
    134134        'sv_vader_',
    135135        'sv-vader-',
     
    138138    );
    139139
    140     $crons = _get_cron_array();
    141     if ( is_array( $crons ) ) {
    142         foreach ( $crons as $timestamp => $hooks ) {
    143             if ( ! is_array( $hooks ) ) {
     140    $sv_vader_crons = _get_cron_array();
     141    if ( is_array( $sv_vader_crons ) ) {
     142        foreach ( $sv_vader_crons as $sv_vader_timestamp => $sv_vader_hooks ) {
     143            if ( ! is_array( $sv_vader_hooks ) ) {
    144144                continue;
    145145            }
    146             foreach ( $hooks as $hook => $events ) {
    147                 foreach ( $prefixes as $pfx ) {
    148                     if ( strpos( $hook, $pfx ) === 0 ) {
    149                         while ( wp_next_scheduled( $hook ) ) {
    150                             wp_clear_scheduled_hook( $hook );
     146            foreach ( $sv_vader_hooks as $sv_vader_hook => $sv_vader_events ) {
     147                foreach ( $sv_vader_prefixes as $sv_vader_pfx ) {
     148                    if ( strpos( $sv_vader_hook, $sv_vader_pfx ) === 0 ) {
     149                        while ( wp_next_scheduled( $sv_vader_hook ) ) {
     150                            wp_clear_scheduled_hook( $sv_vader_hook );
    151151                        }
    152152                        break;
Note: See TracChangeset for help on using the changeset viewer.