Changeset 3420396
- Timestamp:
- 12/15/2025 05:26:18 PM (2 months ago)
- Location:
- spelhubben-weather/trunk
- Files:
-
- 21 added
- 23 edited
-
README.md (added)
-
admin/admin.php (modified) (4 diffs)
-
admin/page-settings.php (modified) (1 diff)
-
admin/page-shortcodes.php (modified) (4 diffs)
-
assets/icons/fog.svg (added)
-
assets/icons/hail.svg (added)
-
assets/icons/modern-flat-cloud.svg (added)
-
assets/icons/modern-flat-fog.svg (added)
-
assets/icons/modern-flat-partly-cloudy-alt.svg (added)
-
assets/icons/modern-flat-partly-cloudy.svg (added)
-
assets/icons/modern-flat-rain.svg (added)
-
assets/icons/modern-flat-sleet.svg (added)
-
assets/icons/modern-flat-snow.svg (added)
-
assets/icons/modern-flat-storm.svg (added)
-
assets/icons/modern-flat-sun.svg (added)
-
assets/icons/modern-gradient-cloud.svg (added)
-
assets/icons/modern-gradient-fog.svg (added)
-
assets/icons/modern-gradient-rain.svg (added)
-
assets/icons/modern-gradient-sleet.svg (added)
-
assets/icons/modern-gradient-snow.svg (added)
-
assets/icons/modern-gradient-storm.svg (added)
-
assets/icons/partly-cloudy.svg (added)
-
assets/icons/sleet.svg (added)
-
assets/map.js (modified) (3 diffs)
-
assets/style.css (modified) (1 diff)
-
includes/class-plugin.php (modified) (1 diff)
-
includes/class-renderer.php (modified) (14 diffs)
-
includes/class-sv-vader.php (modified) (8 diffs)
-
includes/class-wporg-plugins.php (added)
-
includes/format.php (modified) (5 diffs)
-
includes/options.php (modified) (3 diffs)
-
includes/providers.php (modified) (10 diffs)
-
languages/spelhubben-weather-nb_NO-ef457c6fc9879530ccb874bec7a8e544.json (modified) (1 diff)
-
languages/spelhubben-weather-nb_NO.l10n.php (modified) (1 diff)
-
languages/spelhubben-weather-nb_NO.mo (modified) (previous)
-
languages/spelhubben-weather-nb_NO.po (modified) (14 diffs)
-
languages/spelhubben-weather-sv_SE-ef457c6fc9879530ccb874bec7a8e544.json (modified) (1 diff)
-
languages/spelhubben-weather-sv_SE.l10n.php (modified) (1 diff)
-
languages/spelhubben-weather-sv_SE.mo (modified) (previous)
-
languages/spelhubben-weather-sv_SE.po (modified) (13 diffs)
-
languages/spelhubben-weather.pot (modified) (10 diffs)
-
readme.txt (modified) (5 diffs)
-
spelhubben-weather.php (modified) (3 diffs)
-
uninstall.php (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
spelhubben-weather/trunk/admin/admin.php
r3384734 r3420396 18 18 if ( strpos( $hook, 'sv-vader' ) === false ) { 19 19 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 ); 20 26 } 21 27 … … 138 144 add_settings_field( 'map_default', __( 'Show map by default', 'spelhubben-weather' ), 'sv_vader_field_map_default', 'sv_vader', 'sv_vader_main' ); 139 145 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' ); 140 147 add_settings_field( 'providers', __( 'Data providers', 'spelhubben-weather' ), 'sv_vader_field_providers', 'sv_vader', 'sv_vader_main' ); 141 148 add_settings_field( 'yr_contact', __( 'Yr contact/UA', 'spelhubben-weather' ), 'sv_vader_field_yr_contact', 'sv_vader', 'sv_vader_main' ); … … 218 225 } 219 226 227 function 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 220 247 function sv_vader_field_providers() { 221 248 $o = sv_vader_get_options(); … … 242 269 // NEW: FMI 243 270 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>', 245 272 checked( 1, ! empty( $o['prov_fmi'] ), false ), 246 273 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' ) 247 284 ); 248 285 } -
spelhubben-weather/trunk/admin/page-settings.php
r3372751 r3420396 95 95 </div> 96 96 </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> 97 107 </div><!-- /.wrap --> 98 108 <?php -
spelhubben-weather/trunk/admin/page-shortcodes.php
r3384734 r3420396 17 17 $nx5 = '[spelhubben_weather place="Malmö" show="temp,wind" map="0" units="imperial"]'; 18 18 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 26 19 $new_examples = array( 27 20 array( 'label' => __( 'Basic example', 'spelhubben-weather' ), 'code' => $nx1 ), … … 30 23 array( 'label' => __( 'Detailed with daily forecast & km/h', 'spelhubben-weather' ), 'code' => $nx4 ), 31 24 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 ),40 25 ); 41 26 ?> … … 79 64 <div class="svv-codeblock-head"> 80 65 <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> 88 70 </div> 89 71 <pre class="svv-pre"><code tabindex="0"><?php echo esc_html( $ex['code'] ); ?></code></pre> … … 92 74 </div> 93 75 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>117 76 </div> 118 77 </div> -
spelhubben-weather/trunk/assets/map.js
r3372751 r3420396 14 14 15 15 // 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 } 17 23 18 24 // Compute a scale factor based on actual card width … … 74 80 const ro = new ResizeObserver(debounce(applyScale, 60)); 75 81 ro.observe(card); 82 83 // Store observer reference for cleanup 84 card._svvResizeObserver = ro; 76 85 }); 77 86 }, 50); … … 81 90 } else { attachRO(); } 82 91 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 }); 84 119 })(); -
spelhubben-weather/trunk/assets/style.css
r3372751 r3420396 11 11 width:100%; 12 12 max-width:100%; 13 contain: layout style paint; 13 14 14 15 border:1px solid #e6e6e6; -
spelhubben-weather/trunk/includes/class-plugin.php
r3372751 r3420396 34 34 35 35 /** 36 * Register legacy shortcode and the new alias.36 * Register the main shortcode. 37 37 */ 38 38 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) 43 40 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);51 41 } 52 42 -
spelhubben-weather/trunk/includes/class-renderer.php
r3384734 r3420396 24 24 'yr' => $opts['prov_yr'], 25 25 '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, 27 29 ]))), 28 30 'animate' => '1', 29 31 'forecast' => 'none', 30 32 'days' => '5', 33 'comparison' => '0', // NEW: Show individual provider data 31 34 32 35 // Units & formatting (overrides) … … 43 46 44 47 $provider_list = array_filter(array_map('trim', explode(',', strtolower($a['providers'])))); 45 $allowed = ['openmeteo','smhi','yr','metno_nowcast','fmi' ]; // NEW48 $allowed = ['openmeteo','smhi','yr','metno_nowcast','fmi','openweathermap','weatherapi']; 46 49 $provider_list = array_values(array_intersect($provider_list, $allowed)); 47 50 if (empty($provider_list)) $provider_list = ['openmeteo']; … … 50 53 51 54 // Units 52 $units = sv v_resolve_units([55 $units = sv_vader_resolve_units([ 53 56 'units' => $a['units'], 54 57 'temp_unit' => $a['temp_unit'], … … 59 62 60 63 $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 61 72 $res = $api->get_current_weather($a['ort'], $a['lat'], $a['lon'], $provider_list, $opts['yr_contact']); 62 73 if (is_wp_error($res)) return '<em>' . esc_html($res->get_error_message()) . '</em>'; 63 74 64 75 // Convert values according to selected units 65 list($t_val, $t_sym) = sv v_temp($res['temp'] ?? null, $units['temp'], 0);66 list($w_val, $w_u) = sv v_wind($res['wind'] ?? null, $units['wind'], 0);67 list($p_val, $p_u) = sv v_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); 68 79 $cloud = isset($res['cloud']) ? intval($res['cloud']) : null; 69 80 … … 94 105 <?php endif; ?> 95 106 <?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> 97 108 <?php endif; ?> 98 109 </div> … … 105 116 <?php endif; ?> 106 117 <?php if (in_array('temp', $show, true) && $t_val !== null): ?> 107 <div class="svv-temp"><?php echo esc_html( sv v_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> 108 119 <?php endif; ?> 109 120 <?php if (in_array('wind', $show, true) && $w_val !== null): ?> 110 121 <?php 111 122 /* translators: 1: wind value, 2: wind unit (e.g. 5, km/h) */ 112 $wind_compact = sprintf( __( 'Wind %1$s %2$s', 'spelhubben-weather' ), sv v_num($w_val), $w_u );123 $wind_compact = sprintf( __( 'Wind %1$s %2$s', 'spelhubben-weather' ), sv_vader_num($w_val), $w_u ); 113 124 ?> 114 125 <span class="svv-wind svv-badge"><?php echo esc_html( $wind_compact ); ?></span> … … 127 138 <div class="svv-col"> 128 139 <?php if (in_array('temp', $show, true) && $t_val !== null): ?> 129 <div class="svv-temp"><?php echo esc_html( sv v_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> 130 141 <?php endif; ?> 131 142 <div class="svv-meta"> … … 133 144 <?php 134 145 /* translators: 1: wind value, 2: wind unit (e.g. 5, km/h) */ 135 $wind_detailed = sprintf( __( 'Wind: %1$s %2$s', 'spelhubben-weather' ), sv v_num($w_val), $w_u );146 $wind_detailed = sprintf( __( 'Wind: %1$s %2$s', 'spelhubben-weather' ), sv_vader_num($w_val), $w_u ); 136 147 ?> 137 148 <span class="svv-wind"><?php echo esc_html( $wind_detailed ); ?></span> … … 145 156 <?php 146 157 /* translators: 1: precipitation value, 2: precipitation unit (e.g. 1.2, mm) */ 147 $precip_str = sprintf( __( 'Precipitation: %1$s %2$s', 'spelhubben-weather' ), sv v_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 ); 148 159 ?> 149 160 <span class="svv-precip"><?php echo esc_html( $precip_str ); ?></span> … … 152 163 <?php 153 164 /* translators: %s: cloud cover percent (0–100) */ 154 $cloud_str = sprintf( __( 'Cloud cover: %s%%', 'spelhubben-weather' ), sv v_num($cloud) );165 $cloud_str = sprintf( __( 'Cloud cover: %s%%', 'spelhubben-weather' ), sv_vader_num($cloud) ); 155 166 ?> 156 167 <span class="svv-cloud"><?php echo esc_html( $cloud_str ); ?></span> … … 168 179 <?php endif; ?> 169 180 <?php if (in_array('temp', $show, true) && $t_val !== null): ?> 170 <div class="svv-temp"><?php echo esc_html( sv v_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> 171 182 <?php endif; ?> 172 183 </div> … … 176 187 <?php 177 188 /* translators: 1: wind value, 2: wind unit (e.g. 5, km/h) */ 178 $wind_card = sprintf( __( 'Wind: %1$s %2$s', 'spelhubben-weather' ), sv v_num($w_val), $w_u );189 $wind_card = sprintf( __( 'Wind: %1$s %2$s', 'spelhubben-weather' ), sv_vader_num($w_val), $w_u ); 179 190 ?> 180 191 <span class="svv-wind"><?php echo esc_html( $wind_card ); ?></span> … … 215 226 <div class="svv-daytemps"> 216 227 <?php 217 list($fmax,) = sv v_temp($d['tmax'], $units['temp'], 0);218 list($fmin,) = sv v_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); 219 230 ?> 220 <span class="svv-tmax"><?php echo esc_html( sv v_num($fmax) ); ?>°</span>221 <span class="svv-tmin"><?php echo esc_html( sv v_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> 222 233 </div> 223 234 <?php if (!empty($d['desc'])): ?> … … 232 243 return ob_get_clean(); 233 244 } 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 } 234 324 } 235 325 } -
spelhubben-weather/trunk/includes/class-sv-vader.php
r3384734 r3420396 38 38 39 39 if (in_array('openmeteo', $providers, true)) { 40 $om = sv p_openmeteo_current($lat, $lon, $api_lang);40 $om = sv_vader_openmeteo_current($lat, $lon, $api_lang); 41 41 if ($om) $samples[] = $om; 42 42 } 43 43 if (in_array('smhi', $providers, true)) { 44 $sm = sv p_smhi_current($lat, $lon);44 $sm = sv_vader_smhi_current($lat, $lon); 45 45 if ($sm) $samples[] = $sm; 46 46 } 47 47 if (in_array('yr', $providers, true)) { 48 $yr = sv p_yr_current($lat, $lon, $yr_contact);48 $yr = sv_vader_yr_current($lat, $lon, $yr_contact); 49 49 if ($yr) $samples[] = $yr; 50 50 } 51 // NEW: FMI52 51 if (in_array('fmi', $providers, true)) { 53 $fmi = sv p_fmi_current($lat, $lon);52 $fmi = sv_vader_fmi_current($lat, $lon); 54 53 if ($fmi) $samples[] = $fmi; 55 54 } 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 } 56 63 57 64 if (empty($samples)) { … … 59 66 } 60 67 61 $cons = sv p_consensus($samples);68 $cons = sv_vader_consensus($samples); 62 69 63 70 $out = array_merge([ … … 71 78 } 72 79 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 73 143 public function get_daily_forecast($ort = '', $lat = '', $lon = '', $days = 5) { 74 144 $ort = trim((string)$ort); … … 91 161 } 92 162 93 $list = sv p_openmeteo_daily($lat, $lon, $days, $api_lang);163 $list = sv_vader_openmeteo_daily($lat, $lon, $days, $api_lang); 94 164 set_transient($cache_key, $list, MINUTE_IN_SECONDS * $this->cache_minutes); 95 165 return $list; … … 97 167 98 168 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 99 176 $url = add_query_arg([ 100 177 'name' => $q, … … 113 190 114 191 $r = $data['results'][0]; 115 return[192 $result = [ 116 193 'lat' => (string)$r['latitude'], 117 194 'lon' => (string)$r['longitude'], 118 195 'name' => trim(($r['name'] ?? '') . (isset($r['country_code']) ? ', ' . $r['country_code'] : '')) 119 196 ]; 197 198 // Cache geocoding result for 7 days 199 set_transient($geocode_cache_key, $result, DAY_IN_SECONDS * 7); 200 return $result; 120 201 } 121 202 … … 123 204 if ($code === null) return ''; 124 205 $type = 'cloud'; 206 // Clear sky 125 207 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 128 221 } elseif (in_array($code, [71,73,75,77,85,86], true)) { $type = 'snow'; 222 // Thunderstorm 129 223 } elseif (in_array($code, [95,96,99], true)) { $type = 'storm'; } 130 224 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 131 245 $rel = 'assets/icons/' . $type . '.svg'; 132 246 $path = trailingslashit(SV_VADER_DIR) . $rel; … … 138 252 139 253 private function svg_data_uri($type) { 140 // (unchanged inline SVGs)254 // Fallback inline SVG data URIs for icon types 141 255 $svg = ''; 142 256 if ($type === 'sun') { 143 257 $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>'; 144 260 } elseif ($type === 'cloud') { 145 261 $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>'; 146 264 } elseif ($type === 'rain') { 147 265 $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>'; 148 268 } elseif ($type === 'snow') { 149 269 $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>'; 150 272 } else { 273 // Storm (thunderbolt) 151 274 $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>'; 152 275 } -
spelhubben-weather/trunk/includes/format.php
r3372751 r3420396 10 10 * - imperial => F, mph, in 11 11 */ 12 if (!function_exists('sv v_resolve_units')) {13 function sv v_resolve_units(array $in): array {12 if (!function_exists('sv_vader_resolve_units')) { 13 function sv_vader_resolve_units(array $in): array { 14 14 $preset = strtolower($in['units'] ?? ''); 15 15 $map = [ … … 34 34 } 35 35 36 if (!function_exists('sv v_temp')) {37 function sv v_temp(?float $celsius, string $unit, int $dec = 0): array {36 if (!function_exists('sv_vader_temp')) { 37 function sv_vader_temp(?float $celsius, string $unit, int $dec = 0): array { 38 38 if ($celsius === null) return [null, $unit === 'F' ? '°F' : '°C']; 39 39 if ($unit === 'F') { … … 45 45 } 46 46 47 if (!function_exists('sv v_wind')) {48 function sv v_wind(?float $ms, string $unit, int $dec = 0): array {47 if (!function_exists('sv_vader_wind')) { 48 function sv_vader_wind(?float $ms, string $unit, int $dec = 0): array { 49 49 if ($ms === null) return [null, $unit]; 50 50 switch ($unit) { … … 57 57 } 58 58 59 if (!function_exists('sv v_precip')) {60 function sv v_precip(?float $mm, string $unit, int $dec = 1): array {59 if (!function_exists('sv_vader_precip')) { 60 function sv_vader_precip(?float $mm, string $unit, int $dec = 1): array { 61 61 if ($mm === null) return [null, $unit]; 62 62 if ($unit === 'in') { … … 68 68 } 69 69 70 if (!function_exists('sv v_num')) {71 function sv v_num($v, int $decimals = 0) {70 if (!function_exists('sv_vader_num')) { 71 function sv_vader_num($v, int $decimals = 0) { 72 72 if ($v === null || $v === '') return ''; 73 73 return number_format_i18n($v, $decimals); -
spelhubben-weather/trunk/includes/options.php
r3384734 r3420396 15 15 'map_default' => 1, 16 16 'map_height' => 240, 17 'icon_style' => 'classic', // classic | modern-flat | modern-gradient 17 18 18 19 // Data providers … … 21 22 'prov_yr' => 1, 22 23 '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, 29 27 'temp_unit' => '', // optional override: C|F 30 28 'wind_unit' => '', // optional override: ms|kmh|mph … … 72 70 $out['prov_yr'] = !empty($in['prov_yr']) ? 1 : 0; 73 71 $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'; 75 80 76 81 $out['yr_contact'] = sanitize_text_field($in['yr_contact'] ?? $def['yr_contact']); -
spelhubben-weather/trunk/includes/providers.php
r3384734 r3420396 3 3 if (!defined('ABSPATH')) exit; 4 4 5 if (!function_exists('sv p_openmeteo_current')) {6 function sv p_openmeteo_current($lat, $lon, $locale = 'en') {5 if (!function_exists('sv_vader_openmeteo_current')) { 6 function sv_vader_openmeteo_current($lat, $lon, $locale = 'en') { 7 7 $url = add_query_arg([ 8 8 'latitude' => $lat, … … 30 30 } 31 31 32 if (!function_exists('sv p_smhi_current')) {33 function sv p_smhi_current($lat, $lon) {32 if (!function_exists('sv_vader_smhi_current')) { 33 function sv_vader_smhi_current($lat, $lon) { 34 34 $url = sprintf( 35 35 'https://opendata.smhi.se/meteorological/forecast/api/category/pmp3g/version/2/geotype/point/lon/%s/lat/%s/data.json', … … 72 72 } 73 73 74 if (!function_exists('sv p_yr_current')) {75 function sv p_yr_current($lat, $lon, $contactUA = '') {74 if (!function_exists('sv_vader_yr_current')) { 75 function sv_vader_yr_current($lat, $lon, $contactUA = '') { 76 76 $ua = 'Spelhubben-Weather/1.0'; 77 77 if ($contactUA) $ua .= ' (' . $contactUA . ')'; … … 116 116 * - t2m (°C), ws_10min (m/s), r_1h (mm), n_man (cloud oktas 0..8) 117 117 */ 118 if (!function_exists('sv p_fmi_current')) {119 function sv p_fmi_current($lat, $lon) {118 if (!function_exists('sv_vader_fmi_current')) { 119 function sv_vader_fmi_current($lat, $lon) { 120 120 $lat = floatval($lat); $lon = floatval($lon); 121 121 if (!$lat && !$lon) return null; … … 139 139 if (!is_string($xml) || $xml==='') return null; 140 140 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 142 146 if (!$sx) return null; 143 147 $sx->registerXPathNamespace('wml2','http://www.opengis.net/waterml/2.0'); … … 167 171 } 168 172 173 if (!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 204 if (!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 169 240 /** 170 241 * WMO code → English text (base language). Wrapped in i18n for translation. 171 242 */ 172 if (!function_exists('sv p_wmo_text')) {173 function sv p_wmo_text($code) {243 if (!function_exists('sv_vader_wmo_text')) { 244 function sv_vader_wmo_text($code) { 174 245 // Translators: weather description from WMO code. 175 246 $map = [ … … 206 277 207 278 // Back-compat: old Swedish helper (now defers to English/i18n version) 208 if (!function_exists('sv p_wmo_text_sv')) {209 function sv p_wmo_text_sv($code) {210 return sv p_wmo_text($code);211 } 212 } 213 214 if (!function_exists('sv p_consensus')) {215 function sv p_consensus(array $samples) {279 if (!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 285 if (!function_exists('sv_vader_consensus')) { 286 function sv_vader_consensus(array $samples) { 216 287 $nums = ['temp','wind','precip','cloud']; 217 288 $out = []; … … 236 307 if ($om !== null) { 237 308 $out['code'] = $om; 238 $out['desc'] = sv p_wmo_text($om);309 $out['desc'] = sv_vader_wmo_text($om); 239 310 } else { 240 311 $cloud = $out['cloud']; … … 259 330 } 260 331 261 if (!function_exists('sv p_openmeteo_daily')) {332 if (!function_exists('sv_vader_openmeteo_daily')) { 262 333 /** 263 334 * Fetch daily forecast (max/min, WMO code) for N days (3..10). 264 335 * Returns: [ ['date'=>'YYYY-MM-DD','tmax'=>..,'tmin'=>..,'code'=>int|null,'desc'=>string], ... ] 265 336 */ 266 function sv p_openmeteo_daily($lat, $lon, $days = 5, $locale = 'en') {337 function sv_vader_openmeteo_daily($lat, $lon, $days = 5, $locale = 'en') { 267 338 $days = max(3, min(10, intval($days))); 268 339 $url = add_query_arg([ … … 292 363 'tmin' => isset($tmin[$i]) ? round(floatval($tmin[$i])) : null, 293 364 'code' => $code, 294 'desc' => ($code !== null) ? sv p_wmo_text($code) : ''365 'desc' => ($code !== null) ? sv_vader_wmo_text($code) : '' 295 366 ]; 296 367 } -
spelhubben-weather/trunk/languages/spelhubben-weather-nb_NO-ef457c6fc9879530ccb874bec7a8e544.json
r3372751 r3420396 1 {"translation-revision-date": "2025-1 0-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 1 1 <?php 2 2 // 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-1 0-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']];3 return ['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 3 3 msgstr "" 4 4 "Project-Id-Version: Spelhubben Weather\n" 5 "POT-Creation-Date: 2025-1 0-04 09:32+0200\n"6 "PO-Revision-Date: 2025-1 0-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" 7 7 "Last-Translator: \n" 8 8 "Language-Team: \n" … … 11 11 "Content-Type: text/plain; charset=UTF-8\n" 12 12 "Content-Transfer-Encoding: 8bit\n" 13 "X-Generator: Poedit 3. 7\n"13 "X-Generator: Poedit 3.8\n" 14 14 "X-Poedit-Basepath: ..\n" 15 15 "X-Poedit-Flags-xgettext: --add-comments=translators:\n" … … 22 22 "X-Poedit-SearchPathExcluded-1: assets/vendor\n" 23 23 24 #: admin/admin.php: 4924 #: admin/admin.php:55 25 25 msgid "Copied!" 26 26 msgstr "Kopiert!" 27 27 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 30 29 msgid "Copy" 31 30 msgstr "Kopier" 32 31 33 #: admin/admin.php:5 1 admin/page-shortcodes.php:14032 #: admin/admin.php:57 admin/page-shortcodes.php:99 34 33 msgid "Expand" 35 34 msgstr "Utvid" 36 35 37 #: admin/admin.php:5 236 #: admin/admin.php:58 38 37 msgid "Collapse" 39 38 msgstr "Slå sammen" 40 39 41 #: admin/admin.php:5 340 #: admin/admin.php:59 42 41 msgid "Rendering…" 43 42 msgstr "Gjengivelse…" 44 43 45 #: admin/admin.php: 5444 #: admin/admin.php:60 46 45 msgid "OK" 47 46 msgstr "OK" 48 47 49 #: admin/admin.php: 5548 #: admin/admin.php:61 50 49 msgid "Failed" 51 50 msgstr "Mislyktes" 52 51 53 #: admin/admin.php: 5652 #: admin/admin.php:62 54 53 msgid "Preview failed" 55 54 msgstr "Forhåndsvisning mislyktes" 56 55 57 56 #. Plugin Name of the plugin/theme 58 #: admin/admin.php: 87 admin/admin.php:88includes/Widget/class-widget.php:1957 #: admin/admin.php:93 admin/admin.php:94 includes/Widget/class-widget.php:19 59 58 msgid "Spelhubben Weather" 60 59 msgstr "Spelhubben Været" 61 60 62 #: admin/admin.php: 99 admin/admin.php:100 includes/class-plugin.php:11461 #: admin/admin.php:105 admin/admin.php:106 includes/class-plugin.php:104 63 62 msgid "Settings" 64 63 msgstr "Innstillinger" 65 64 66 #: admin/admin.php:1 09 admin/admin.php:11065 #: admin/admin.php:115 admin/admin.php:116 67 66 msgid "Shortcodes" 68 67 msgstr "Kortkode" 69 68 70 #: admin/admin.php:13 2admin/page-settings.php:4469 #: admin/admin.php:138 admin/page-settings.php:44 71 70 msgid "Default settings" 72 71 msgstr "Standardinnstillinger" 73 72 74 #: admin/admin.php:1 3473 #: admin/admin.php:140 75 74 msgid "Default place" 76 75 msgstr "Standardsted" 77 76 78 #: admin/admin.php:1 3577 #: admin/admin.php:141 79 78 msgid "Cache TTL (minutes)" 80 79 msgstr "Cache-TTL (minutter)" 81 80 82 #: admin/admin.php:1 3681 #: admin/admin.php:142 83 82 msgid "Default fields" 84 83 msgstr "Standardfelt" 85 84 86 #: admin/admin.php:1 3785 #: admin/admin.php:143 87 86 msgid "Default layout" 88 87 msgstr "Standardoppsett" 89 88 90 #: admin/admin.php:1 3889 #: admin/admin.php:144 91 90 msgid "Show map by default" 92 91 msgstr "Vis kart som standard" 93 92 94 #: admin/admin.php:1 39blocks/spelhubben-weather/index.js:5993 #: admin/admin.php:145 blocks/spelhubben-weather/index.js:59 95 94 msgid "Map height (px)" 96 95 msgstr "Karthøyde (px)" 97 96 98 #: admin/admin.php:140 97 #: admin/admin.php:146 98 msgid "Icon style" 99 msgstr "" 100 101 #: admin/admin.php:147 99 102 msgid "Data providers" 100 103 msgstr "Dataleverandører" 101 104 102 #: admin/admin.php:14 1105 #: admin/admin.php:148 103 106 msgid "Yr contact/UA" 104 107 msgstr "Yr kontakt/UA" 105 108 106 #: admin/admin.php:1 44 admin/page-shortcodes.php:166109 #: admin/admin.php:151 admin/page-shortcodes.php:125 107 110 #: blocks/spelhubben-weather/index.js:68 108 111 msgid "Units & format" 109 112 msgstr "Enheter og format" 110 113 111 #: admin/admin.php:1 45blocks/spelhubben-weather/index.js:70114 #: admin/admin.php:152 blocks/spelhubben-weather/index.js:70 112 115 msgid "Preset" 113 116 msgstr "Forhåndsinnstilt" 114 117 115 #: admin/admin.php:1 46118 #: admin/admin.php:153 116 119 msgid "Overrides (optional)" 117 120 msgstr "Overstyringer (valgfritt)" 118 121 119 #: admin/admin.php:1 47122 #: admin/admin.php:154 120 123 msgid "Date format (PHP)" 121 124 msgstr "Datoformat (PHP)" 122 125 123 #: admin/admin.php:1 57blocks/spelhubben-weather/index.js:36126 #: admin/admin.php:164 blocks/spelhubben-weather/index.js:36 124 127 msgid "e.g. Stockholm" 125 128 msgstr "f.eks. Oslo" 126 129 127 #: admin/admin.php:17 1130 #: admin/admin.php:178 128 131 msgid "How long weather data is cached (transients)." 129 132 msgstr "Hvor lenge værdata lagres i mellomlagring (transienter)." 130 133 131 #: admin/admin.php:18 0134 #: admin/admin.php:187 132 135 msgid "Comma-separated: temp,wind,icon" 133 136 msgstr "Kommaseparert: temp, vind, ikon" 134 137 135 #: admin/admin.php:1 86138 #: admin/admin.php:193 136 139 msgctxt "layout label" 137 140 msgid "Inline" 138 141 msgstr "Innebygd" 139 142 140 #: admin/admin.php:1 87143 #: admin/admin.php:194 141 144 msgctxt "layout label" 142 145 msgid "Compact" 143 146 msgstr "Kompakt" 144 147 145 #: admin/admin.php:1 88148 #: admin/admin.php:195 146 149 msgctxt "layout label" 147 150 msgid "Card" 148 151 msgstr "Kort" 149 152 150 #: admin/admin.php:1 89153 #: admin/admin.php:196 151 154 msgctxt "layout label" 152 155 msgid "Detailed" 153 156 msgstr "Detaljert" 154 157 155 #: admin/admin.php:2 08158 #: admin/admin.php:215 156 159 msgid "Enable map as default." 157 160 msgstr "Aktiver kart som standard." 158 161 159 #: admin/admin.php:225 162 #: admin/admin.php:230 163 msgid "Classic" 164 msgstr "Klassisk" 165 166 #: admin/admin.php:231 167 msgid "Modern Flat" 168 msgstr "Moderne leilighet" 169 170 #: admin/admin.php:232 171 msgid "Modern Gradient" 172 msgstr "Moderne gradient" 173 174 #: admin/admin.php:244 175 msgid "Choose your preferred weather icon theme." 176 msgstr "Velg ditt foretrukne værikontema." 177 178 #: admin/admin.php:252 160 179 msgid "Open-Meteo" 161 180 msgstr "Open-Meteo" 162 181 163 #: admin/admin.php:2 30182 #: admin/admin.php:257 164 183 msgid "SMHI" 165 184 msgstr "SMHI" 166 185 167 #: admin/admin.php:2 35186 #: admin/admin.php:262 168 187 msgid "Yr (MET Norway)" 169 188 msgstr "Yr (MET Norway)" 170 189 171 #: admin/admin.php:2 40190 #: admin/admin.php:267 172 191 msgid "MET Norway Nowcast" 173 192 msgstr "MET Norway Nowcast" 174 193 175 #: admin/admin.php:250 194 #: admin/admin.php:273 195 msgid "FMI (Finland, Open Data)" 196 msgstr "FMI (Finland, Open Data)" 197 198 #: admin/admin.php:278 199 msgid "Open-Weathermap" 200 msgstr "Open-Weathermap" 201 202 #: admin/admin.php:283 203 msgid "Weatherapi.com" 204 msgstr "Weatherapi.com" 205 206 #: admin/admin.php:293 176 207 msgid "Recommended by MET Norway: include an email or URL in your User-Agent." 177 208 msgstr "" … … 179 210 "din." 180 211 181 #: admin/admin.php:2 56blocks/spelhubben-weather/index.js:16212 #: admin/admin.php:299 blocks/spelhubben-weather/index.js:16 182 213 msgid "Metric (°C, m/s, mm)" 183 214 msgstr "Metrisk (°C, m/s, mm)" 184 215 185 #: admin/admin.php: 257blocks/spelhubben-weather/index.js:17216 #: admin/admin.php:300 blocks/spelhubben-weather/index.js:17 186 217 msgid "Metric (°C, km/h, mm)" 187 218 msgstr "Metrisk (°C, km/t, mm)" 188 219 189 #: admin/admin.php: 258blocks/spelhubben-weather/index.js:18220 #: admin/admin.php:301 blocks/spelhubben-weather/index.js:18 190 221 msgid "Imperial (°F, mph, in)" 191 222 msgstr "Imperial (°F, mph, in)" 192 223 193 #: admin/admin.php: 276224 #: admin/admin.php:319 194 225 msgid "Temp unit" 195 226 msgstr "Temp-enhet" 196 227 197 #: admin/admin.php: 281228 #: admin/admin.php:324 198 229 msgid "Wind unit" 199 230 msgstr "Vindenhet" 200 231 201 #: admin/admin.php: 286232 #: admin/admin.php:329 202 233 msgid "Precip unit" 203 234 msgstr "Nedbørsenhet" 204 235 205 #: admin/admin.php: 297236 #: admin/admin.php:340 206 237 msgid "Used for forecast day labels." 207 238 msgstr "Brukes til etiketter for prognosedag." … … 276 307 msgstr "Kortkode" 277 308 278 #: admin/page-settings.php:91 admin/page-shortcodes.php:1 65309 #: admin/page-settings.php:91 admin/page-shortcodes.php:124 279 310 #: blocks/spelhubben-weather/index.js:84 280 311 msgid "Forecast" … … 285 316 msgstr "Brosjyrekart" 286 317 287 #: admin/page-shortcodes.php:2 7318 #: admin/page-shortcodes.php:20 288 319 msgid "Basic example" 289 320 msgstr "Grunnleggende eksempel" 290 321 291 #: admin/page-shortcodes.php:2 8322 #: admin/page-shortcodes.php:21 292 323 msgid "Compact with map & animation" 293 324 msgstr "Kompakt med kart og animasjon" 294 325 295 #: admin/page-shortcodes.php:2 9326 #: admin/page-shortcodes.php:22 296 327 msgid "Inline without map" 297 328 msgstr "Innebygd uten kart" 298 329 299 #: admin/page-shortcodes.php: 30330 #: admin/page-shortcodes.php:23 300 331 msgid "Detailed with daily forecast & km/h" 301 332 msgstr "Detaljert med daglig værmelding og km/t" 302 333 303 #: admin/page-shortcodes.php: 31334 #: admin/page-shortcodes.php:24 304 335 msgid "Only temperature + wind, imperial" 305 336 msgstr "Kun temperatur + vind, imperial" 306 337 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 328 339 msgid "Spelhubben Weather – Shortcodes" 329 340 msgstr "Spelhubben Vær – Kortkoder" 330 341 331 #: admin/page-shortcodes.php: 44342 #: admin/page-shortcodes.php:29 332 343 msgid "" 333 344 "Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your " … … 337 348 "kortkode på utklippstavlen." 338 349 339 #: admin/page-shortcodes.php: 50 admin/page-shortcodes.php:204350 #: admin/page-shortcodes.php:35 admin/page-shortcodes.php:163 340 351 msgid "Back to Settings" 341 352 msgstr "Tilbake til innstillinger" 342 353 343 #: admin/page-shortcodes.php: 55354 #: admin/page-shortcodes.php:40 344 355 msgid "Search examples… e.g. inline, map, imperial" 345 356 msgstr "Søkeeksempler… f.eks. innebygd, kart, imperial" 346 357 347 #: admin/page-shortcodes.php: 61358 #: admin/page-shortcodes.php:46 348 359 msgid "Copy all (visible)" 349 360 msgstr "Kopier alle (synlige)" 350 361 351 #: admin/page-shortcodes.php: 71362 #: admin/page-shortcodes.php:56 352 363 msgid "Quick start – shortcodes" 353 364 msgstr "Hurtigstart – kortkoder" 354 365 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 368 367 msgid "Preview" 369 368 msgstr "Forhåndsvisning" 370 369 371 #: admin/page-shortcodes.php: 129370 #: admin/page-shortcodes.php:88 372 371 msgid "Click a snippet to send it here. You can edit, copy or expand the box." 373 372 msgstr "" … … 375 374 "utvide boksen." 376 375 377 #: admin/page-shortcodes.php: 137includes/i18n.php:47376 #: admin/page-shortcodes.php:96 includes/i18n.php:47 378 377 msgid "Clear" 379 378 msgstr "Fjerne" 380 379 381 #: admin/page-shortcodes.php:1 44380 #: admin/page-shortcodes.php:103 382 381 msgid "Shortcode preview" 383 382 msgstr "Forhåndsvisning av kortkode" 384 383 385 #: admin/page-shortcodes.php:1 48384 #: admin/page-shortcodes.php:107 386 385 msgid "Live preview" 387 386 msgstr "Direkte forhåndsvisning" 388 387 389 #: admin/page-shortcodes.php:1 52388 #: admin/page-shortcodes.php:111 390 389 msgid "Shortcode live preview" 391 390 msgstr "Forhåndsvisning av kortkode i sanntid" 392 391 393 #: admin/page-shortcodes.php:1 59392 #: admin/page-shortcodes.php:118 394 393 msgid "Attributes – overview" 395 394 msgstr "Attributter – oversikt" 396 395 397 #: admin/page-shortcodes.php:1 63blocks/spelhubben-weather/index.js:31396 #: admin/page-shortcodes.php:122 blocks/spelhubben-weather/index.js:31 398 397 msgid "Location" 399 398 msgstr "Lokasjon" 400 399 401 #: admin/page-shortcodes.php:1 64blocks/spelhubben-weather/index.js:43400 #: admin/page-shortcodes.php:123 blocks/spelhubben-weather/index.js:43 402 401 msgid "Display" 403 402 msgstr "Fremvisning" 404 403 405 #: admin/page-shortcodes.php:1 73404 #: admin/page-shortcodes.php:132 406 405 msgid "Attribute" 407 406 msgstr "Attributt" 408 407 409 #: admin/page-shortcodes.php:1 74408 #: admin/page-shortcodes.php:133 410 409 msgid "Description" 411 410 msgstr "Beskrivelse" 412 411 413 #: admin/page-shortcodes.php:1 75412 #: admin/page-shortcodes.php:134 414 413 msgid "Example" 415 414 msgstr "Eksempel" 416 415 417 #: admin/page-shortcodes.php:1 79416 #: admin/page-shortcodes.php:138 418 417 msgid "Place name to geocode (used if lat/lon are missing)." 419 418 msgstr "" 420 419 "Stedsnavn som skal geokodes (brukes hvis breddegrad/lengdegrad mangler)." 421 420 422 #: admin/page-shortcodes.php:1 80421 #: admin/page-shortcodes.php:139 423 422 msgid "Coordinates take precedence over place." 424 423 msgstr "Koordinater prioriteres fremfor sted." 425 424 426 #: admin/page-shortcodes.php:1 82425 #: admin/page-shortcodes.php:141 427 426 msgid "Fields to display: temp,wind,icon" 428 427 msgstr "Felt som skal vises: temp, vind, ikon" 429 428 430 #: admin/page-shortcodes.php:1 83429 #: admin/page-shortcodes.php:142 431 430 msgid "inline | compact | card | detailed" 432 431 msgstr "innebygd | kompakt | kort | detaljert" 433 432 434 #: admin/page-shortcodes.php:1 84433 #: admin/page-shortcodes.php:143 435 434 msgid "1/0 to show/hide map" 436 435 msgstr "1/0 for å vise/skjule kart" 437 436 438 #: admin/page-shortcodes.php:1 85437 #: admin/page-shortcodes.php:144 439 438 msgid "Map height in px (min 120)." 440 439 msgstr "Karthøyde i piksler (min. 120)." 441 440 442 #: admin/page-shortcodes.php:1 86441 #: admin/page-shortcodes.php:145 443 442 msgid "openmeteo,smhi,yr,metno_nowcast (comma-separated)" 444 443 msgstr "openmeteo,smhi,yr,metno_nowcast (kommaseparert)" 445 444 446 #: admin/page-shortcodes.php:1 87445 #: admin/page-shortcodes.php:146 447 446 msgid "1/0 – subtle animations" 448 447 msgstr "1/0 – subtile animasjoner" 449 448 450 #: admin/page-shortcodes.php:1 89449 #: admin/page-shortcodes.php:148 451 450 msgid "none | daily" 452 451 msgstr "ingen | daglig" 453 452 454 #: admin/page-shortcodes.php:1 90453 #: admin/page-shortcodes.php:149 455 454 msgid "Number of days in the forecast (3–10)" 456 455 msgstr "Antall dager i værmeldingen (3–10)" 457 456 458 #: admin/page-shortcodes.php:1 92457 #: admin/page-shortcodes.php:151 459 458 msgid "Preset: metric | metric_kmh | imperial" 460 459 msgstr "Forhåndsinnstilling: metrisk | metrisk_kmt | britisk" 461 460 462 #: admin/page-shortcodes.php:1 93461 #: admin/page-shortcodes.php:152 463 462 msgid "Override temperature unit" 464 463 msgstr "Overstyr temperaturenhet" 465 464 466 #: admin/page-shortcodes.php:1 94465 #: admin/page-shortcodes.php:153 467 466 msgid "Override wind unit" 468 467 msgstr "Overstyr vindenheten" 469 468 470 #: admin/page-shortcodes.php:1 95469 #: admin/page-shortcodes.php:154 471 470 msgid "Override precipitation unit" 472 471 msgstr "Overstyr nedbørsenhet" 473 472 474 #: admin/page-shortcodes.php:1 96473 #: admin/page-shortcodes.php:155 475 474 msgid "Forecast date label (PHP date)" 476 475 msgstr "Prognose-datoetikett (PHP-dato)" … … 602 601 msgstr "Spelhubben Vær (arv)" 603 602 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 605 605 #, php-format 606 msgid "Wind %s %s" 607 msgstr "Vind %s %s" 608 609 #: includes/class-renderer.php:128 includes/class-renderer.php:159 606 msgid "Wind %1$s %2$s" 607 msgstr "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 610 611 #, php-format 611 msgid "Wind: %s %s" 612 msgstr "Vind: %s %s" 613 614 #: includes/class-renderer.php:136 612 msgid "Wind: %1$s %2$s" 613 msgstr "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 615 617 #, php-format 616 msgid "Precipitation: %s %s" 617 msgstr "Nedbør: %s %s" 618 619 #: includes/class-renderer.php:139 618 msgid "Precipitation: %1$s %2$s" 619 msgstr "Nedbør: %1$s %2$s" 620 621 #. translators: %s: cloud cover percent (0–100) 622 #: includes/class-renderer.php:165 620 623 #, php-format 621 624 msgid "Cloud cover: %s%%" 622 625 msgstr "Skydekke: %s%%" 623 626 624 #: includes/class-renderer.php: 178627 #: includes/class-renderer.php:211 625 628 msgid "View on OpenStreetMap" 626 629 msgstr "Vis på OpenStreetMap" 627 630 628 #: includes/class-sv-vader.php:53 631 #: includes/class-renderer.php:269 632 msgid "Provider Comparison" 633 msgstr "Leverandørsammenligning" 634 635 #: includes/class-renderer.php:269 636 msgid "sources" 637 msgstr "kilder" 638 639 #: includes/class-renderer.php:317 640 msgid "Note:" 641 msgstr "Note:" 642 643 #: includes/class-renderer.php:318 644 msgid "" 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." 648 msgstr "" 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 629 654 msgid "Could not fetch weather data from the selected providers." 630 655 msgstr "Kunne ikke hente værdata fra de valgte leverandørene." 631 656 632 #: includes/class-sv-vader.php:1 06657 #: includes/class-sv-vader.php:188 633 658 msgid "Could not find the place." 634 659 msgstr "Kunne ikke finne stedet." 635 660 636 #: includes/i18n.php:48 includes/providers.php:125 661 #: includes/class-wporg-plugins.php:189 662 msgid "Could not fetch plugin list right now." 663 msgstr "Kunne ikke hente listen over pluginer akkurat nå." 664 665 #: includes/class-wporg-plugins.php:194 666 msgid "Retry" 667 msgstr "Prøv på nytt" 668 669 #: includes/class-wporg-plugins.php:200 670 msgid "No other plugins found." 671 msgstr "Ingen andre programtillegg funnet." 672 673 #: includes/class-wporg-plugins.php:223 674 msgid "Other plugins by Spelhubben:" 675 msgstr "Andre programtillegg fra Spelhubben:" 676 677 #: includes/class-wporg-plugins.php:281 678 msgid "Details" 679 msgstr "Detaljer" 680 681 #: includes/class-wporg-plugins.php:282 682 msgid "WP.org" 683 msgstr "WP.org" 684 685 #: includes/class-wporg-plugins.php:309 686 msgid "Active:" 687 msgstr "Aktiv:" 688 689 #: includes/class-wporg-plugins.php:314 690 msgid "Tested:" 691 msgstr "Testet:" 692 693 #: includes/class-wporg-plugins.php:315 694 msgid "Unknown" 695 msgstr "Ukjent" 696 697 #: includes/i18n.php:48 includes/providers.php:248 637 698 msgid "Mostly clear" 638 699 msgstr "Stort sett klart" 639 700 640 #: includes/i18n.php:49 includes/providers.php: 126 includes/providers.php:196701 #: includes/i18n.php:49 includes/providers.php:249 includes/providers.php:319 641 702 msgid "Partly cloudy" 642 703 msgstr "Delvis overskyet" 643 704 644 #: includes/i18n.php:50 includes/providers.php: 127 includes/providers.php:198705 #: includes/i18n.php:50 includes/providers.php:250 includes/providers.php:321 645 706 msgid "Overcast" 646 707 msgstr "Overskyet" 647 708 648 #: includes/i18n.php:51 includes/providers.php: 128709 #: includes/i18n.php:51 includes/providers.php:251 649 710 msgid "Fog" 650 711 msgstr "Tåke" … … 698 759 msgstr "Kraftig snøfall" 699 760 700 #: includes/i18n.php:64 includes/providers.php: 141761 #: includes/i18n.php:64 includes/providers.php:264 701 762 msgid "Snow grains" 702 763 msgstr "Snøkorn" … … 722 783 msgstr "Kraftige snøbyger" 723 784 724 #: includes/i18n.php:70 includes/providers.php: 147785 #: includes/i18n.php:70 includes/providers.php:270 725 786 msgid "Thunderstorm" 726 787 msgstr "Tordenvær" … … 734 795 msgstr "Tordenvær (kraftig hagl)" 735 796 736 #: includes/providers.php: 124 includes/providers.php:194797 #: includes/providers.php:247 includes/providers.php:317 737 798 msgid "Clear sky" 738 799 msgstr "Klar himmel" 739 800 740 #: includes/providers.php: 129801 #: includes/providers.php:252 741 802 msgid "Depositing rime fog" 742 803 msgstr "Avsetning av rimtåke" 743 804 744 #: includes/providers.php: 130805 #: includes/providers.php:253 745 806 msgid "Drizzle: light" 746 807 msgstr "Yrregn: lett" 747 808 748 #: includes/providers.php: 131809 #: includes/providers.php:254 749 810 msgid "Drizzle: moderate" 750 811 msgstr "Yr: moderat" 751 812 752 #: includes/providers.php: 132813 #: includes/providers.php:255 753 814 msgid "Drizzle: dense" 754 815 msgstr "Yr: tett" 755 816 756 #: includes/providers.php: 133817 #: includes/providers.php:256 757 818 msgid "Rain: light" 758 819 msgstr "Lett regn" 759 820 760 #: includes/providers.php: 134821 #: includes/providers.php:257 761 822 msgid "Rain: moderate" 762 823 msgstr "Regn: moderat" 763 824 764 #: includes/providers.php: 135825 #: includes/providers.php:258 765 826 msgid "Rain: heavy" 766 827 msgstr "Regn: kraftig" 767 828 768 #: includes/providers.php: 136829 #: includes/providers.php:259 769 830 msgid "Freezing rain: light" 770 831 msgstr "Underkjølt regn: lett" 771 832 772 #: includes/providers.php: 137833 #: includes/providers.php:260 773 834 msgid "Freezing rain: heavy" 774 835 msgstr "Underkjølt regn: kraftig" 775 836 776 #: includes/providers.php: 138837 #: includes/providers.php:261 777 838 msgid "Snowfall: light" 778 839 msgstr "Snøfall: lett" 779 840 780 #: includes/providers.php: 139841 #: includes/providers.php:262 781 842 msgid "Snowfall: moderate" 782 843 msgstr "Snøfall: moderat" 783 844 784 #: includes/providers.php: 140845 #: includes/providers.php:263 785 846 msgid "Snowfall: heavy" 786 847 msgstr "Snøfall: kraftig" 787 848 788 #: includes/providers.php: 142849 #: includes/providers.php:265 789 850 msgid "Rain showers: slight" 790 851 msgstr "Regnbyger: lett" 791 852 792 #: includes/providers.php: 143853 #: includes/providers.php:266 793 854 msgid "Rain showers: moderate" 794 855 msgstr "Regnbyger: moderat" 795 856 796 #: includes/providers.php: 144857 #: includes/providers.php:267 797 858 msgid "Rain showers: violent" 798 859 msgstr "Regnbyger: voldsomme" 799 860 800 #: includes/providers.php: 145861 #: includes/providers.php:268 801 862 msgid "Snow showers: slight" 802 863 msgstr "Snøbyger: lette" 803 864 804 #: includes/providers.php: 146865 #: includes/providers.php:269 805 866 msgid "Snow showers: heavy" 806 867 msgstr "Snøbyger: kraftig" 807 868 808 #: includes/providers.php: 148869 #: includes/providers.php:271 809 870 msgid "Thunderstorm with slight hail" 810 871 msgstr "Tordenvær med lett hagl" 811 872 812 #: includes/providers.php: 149873 #: includes/providers.php:272 813 874 msgid "Thunderstorm with heavy hail" 814 875 msgstr "Tordenvær med kraftig hagl" 815 876 816 #: includes/providers.php: 191877 #: includes/providers.php:314 817 878 msgid "Precipitation" 818 879 msgstr "Nedbør" … … 825 886 "daily forecast, and multiple layouts." 826 887 msgstr "" 827 "Viser gjeldende vær og en valgfri værmelding med en enkel konsensus på "828 " tversav 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 + " 829 890 "Gutenberg-blokk + klassisk widget. Valgfritt brosjyrekart, diskré " 830 891 "animasjoner, daglig værmelding og flere oppsett." … … 833 894 msgid "Spelhubben" 834 895 msgstr "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-1 0-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 1 1 <?php 2 2 // 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-1 0-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']];3 return ['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 2 2 msgstr "" 3 3 "Project-Id-Version: Spelhubben Weather\n" 4 "POT-Creation-Date: 2025-1 0-04 09:25+0200\n"5 "PO-Revision-Date: 2025-1 0-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" 6 6 "Last-Translator: \n" 7 7 "Language-Team: \n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "X-Generator: Poedit 3. 7\n"12 "X-Generator: Poedit 3.8\n" 13 13 "X-Poedit-Basepath: ..\n" 14 14 "X-Poedit-Flags-xgettext: --add-comments=translators:\n" … … 21 21 "X-Poedit-SearchPathExcluded-1: assets/vendor\n" 22 22 23 #: admin/admin.php: 4923 #: admin/admin.php:55 24 24 msgid "Copied!" 25 25 msgstr "Kopierad!" 26 26 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 29 28 msgid "Copy" 30 29 msgstr "Kopiera" 31 30 32 #: admin/admin.php:5 1 admin/page-shortcodes.php:14031 #: admin/admin.php:57 admin/page-shortcodes.php:99 33 32 msgid "Expand" 34 33 msgstr "Expandera" 35 34 36 #: admin/admin.php:5 235 #: admin/admin.php:58 37 36 msgid "Collapse" 38 37 msgstr "Kollapsa" 39 38 40 #: admin/admin.php:5 339 #: admin/admin.php:59 41 40 msgid "Rendering…" 42 41 msgstr "Genererar…" 43 42 44 #: admin/admin.php: 5443 #: admin/admin.php:60 45 44 msgid "OK" 46 45 msgstr "OK" 47 46 48 #: admin/admin.php: 5547 #: admin/admin.php:61 49 48 msgid "Failed" 50 49 msgstr "Misslyckades" 51 50 52 #: admin/admin.php: 5651 #: admin/admin.php:62 53 52 msgid "Preview failed" 54 53 msgstr "Förhandsgranskningen misslyckades" 55 54 56 55 #. Plugin Name of the plugin/theme 57 #: admin/admin.php: 87 admin/admin.php:88includes/Widget/class-widget.php:1956 #: admin/admin.php:93 admin/admin.php:94 includes/Widget/class-widget.php:19 58 57 msgid "Spelhubben Weather" 59 58 msgstr "Spelhubben Väder" 60 59 61 #: admin/admin.php: 99 admin/admin.php:100 includes/class-plugin.php:11460 #: admin/admin.php:105 admin/admin.php:106 includes/class-plugin.php:104 62 61 msgid "Settings" 63 62 msgstr "Inställningar" 64 63 65 #: admin/admin.php:1 09 admin/admin.php:11064 #: admin/admin.php:115 admin/admin.php:116 66 65 msgid "Shortcodes" 67 66 msgstr "Kortkoder" 68 67 69 #: admin/admin.php:13 2admin/page-settings.php:4468 #: admin/admin.php:138 admin/page-settings.php:44 70 69 msgid "Default settings" 71 70 msgstr "Standardinställningar" 72 71 73 #: admin/admin.php:1 3472 #: admin/admin.php:140 74 73 msgid "Default place" 75 74 msgstr "Standardplats" 76 75 77 #: admin/admin.php:1 3576 #: admin/admin.php:141 78 77 msgid "Cache TTL (minutes)" 79 78 msgstr "Cache-TTL (minuter)" 80 79 81 #: admin/admin.php:1 3680 #: admin/admin.php:142 82 81 msgid "Default fields" 83 82 msgstr "Standardfält" 84 83 85 #: admin/admin.php:1 3784 #: admin/admin.php:143 86 85 msgid "Default layout" 87 86 msgstr "Standard Layout" 88 87 89 #: admin/admin.php:1 3888 #: admin/admin.php:144 90 89 msgid "Show map by default" 91 90 msgstr "Visa karta som standard" 92 91 93 #: admin/admin.php:1 39blocks/spelhubben-weather/index.js:5992 #: admin/admin.php:145 blocks/spelhubben-weather/index.js:59 94 93 msgid "Map height (px)" 95 94 msgstr "Karthöjd (px)" 96 95 97 #: admin/admin.php:140 96 #: admin/admin.php:146 97 msgid "Icon style" 98 msgstr "Ikonstil" 99 100 #: admin/admin.php:147 98 101 msgid "Data providers" 99 102 msgstr "Dataleverantörer" 100 103 101 #: admin/admin.php:14 1104 #: admin/admin.php:148 102 105 msgid "Yr contact/UA" 103 106 msgstr "Yr contact/UA" 104 107 105 #: admin/admin.php:1 44 admin/page-shortcodes.php:166108 #: admin/admin.php:151 admin/page-shortcodes.php:125 106 109 #: blocks/spelhubben-weather/index.js:68 107 110 msgid "Units & format" 108 111 msgstr "Enheter och format" 109 112 110 #: admin/admin.php:1 45blocks/spelhubben-weather/index.js:70113 #: admin/admin.php:152 blocks/spelhubben-weather/index.js:70 111 114 msgid "Preset" 112 115 msgstr "Förinställa" 113 116 114 #: admin/admin.php:1 46117 #: admin/admin.php:153 115 118 msgid "Overrides (optional)" 116 119 msgstr "Åsidosättningar (valfritt)" 117 120 118 #: admin/admin.php:1 47121 #: admin/admin.php:154 119 122 msgid "Date format (PHP)" 120 123 msgstr "Datumformat (PHP)" 121 124 122 #: admin/admin.php:1 57blocks/spelhubben-weather/index.js:36125 #: admin/admin.php:164 blocks/spelhubben-weather/index.js:36 123 126 msgid "e.g. Stockholm" 124 127 msgstr "t.ex. Stockholm" 125 128 126 #: admin/admin.php:17 1129 #: admin/admin.php:178 127 130 msgid "How long weather data is cached (transients)." 128 131 msgstr "Hur länge väderdata cachas (transienter)." 129 132 130 #: admin/admin.php:18 0133 #: admin/admin.php:187 131 134 msgid "Comma-separated: temp,wind,icon" 132 135 msgstr "Kommaavgränsad: temp, vind, ikon" 133 136 134 #: admin/admin.php:1 86137 #: admin/admin.php:193 135 138 msgctxt "layout label" 136 139 msgid "Inline" 137 140 msgstr "Inline" 138 141 139 #: admin/admin.php:1 87142 #: admin/admin.php:194 140 143 msgctxt "layout label" 141 144 msgid "Compact" 142 145 msgstr "Kompakt" 143 146 144 #: admin/admin.php:1 88147 #: admin/admin.php:195 145 148 msgctxt "layout label" 146 149 msgid "Card" 147 150 msgstr "Kort" 148 151 149 #: admin/admin.php:1 89152 #: admin/admin.php:196 150 153 msgctxt "layout label" 151 154 msgid "Detailed" 152 155 msgstr "Detaljer" 153 156 154 #: admin/admin.php:2 08157 #: admin/admin.php:215 155 158 msgid "Enable map as default." 156 159 msgstr "Aktivera karta som standard." 157 160 158 #: admin/admin.php:225 161 #: admin/admin.php:230 162 msgid "Classic" 163 msgstr "Klassisk" 164 165 #: admin/admin.php:231 166 msgid "Modern Flat" 167 msgstr "Modern platt" 168 169 #: admin/admin.php:232 170 msgid "Modern Gradient" 171 msgstr "Modern gradient" 172 173 #: admin/admin.php:244 174 msgid "Choose your preferred weather icon theme." 175 msgstr "Välj ditt föredragna tema för väderikoner." 176 177 #: admin/admin.php:252 159 178 msgid "Open-Meteo" 160 179 msgstr "Open-Meteo" 161 180 162 #: admin/admin.php:2 30181 #: admin/admin.php:257 163 182 msgid "SMHI" 164 183 msgstr "SMHI" 165 184 166 #: admin/admin.php:2 35185 #: admin/admin.php:262 167 186 msgid "Yr (MET Norway)" 168 187 msgstr "Yr (MET Norway)" 169 188 170 #: admin/admin.php:2 40189 #: admin/admin.php:267 171 190 msgid "MET Norway Nowcast" 172 191 msgstr "MET Norway Nowcast" 173 192 174 #: admin/admin.php:250 193 #: admin/admin.php:273 194 msgid "FMI (Finland, Open Data)" 195 msgstr "FMI (Finland, Open Data)" 196 197 #: admin/admin.php:278 198 msgid "Open-Weathermap" 199 msgstr "Open-Weathermap" 200 201 #: admin/admin.php:283 202 msgid "Weatherapi.com" 203 msgstr "Weatherapi.com" 204 205 #: admin/admin.php:293 175 206 msgid "Recommended by MET Norway: include an email or URL in your User-Agent." 176 207 msgstr "" … … 178 209 "användaragent." 179 210 180 #: admin/admin.php:2 56blocks/spelhubben-weather/index.js:16211 #: admin/admin.php:299 blocks/spelhubben-weather/index.js:16 181 212 msgid "Metric (°C, m/s, mm)" 182 213 msgstr "Metrisk (°C, m/s, mm)" 183 214 184 #: admin/admin.php: 257blocks/spelhubben-weather/index.js:17215 #: admin/admin.php:300 blocks/spelhubben-weather/index.js:17 185 216 msgid "Metric (°C, km/h, mm)" 186 217 msgstr "Metrisk (°C, km/h, mm)" 187 218 188 #: admin/admin.php: 258blocks/spelhubben-weather/index.js:18219 #: admin/admin.php:301 blocks/spelhubben-weather/index.js:18 189 220 msgid "Imperial (°F, mph, in)" 190 221 msgstr "Imperial (°F, mph, in)" 191 222 192 #: admin/admin.php: 276223 #: admin/admin.php:319 193 224 msgid "Temp unit" 194 225 msgstr "Temp-enhet" 195 226 196 #: admin/admin.php: 281227 #: admin/admin.php:324 197 228 msgid "Wind unit" 198 229 msgstr "Vindenhet" 199 230 200 #: admin/admin.php: 286231 #: admin/admin.php:329 201 232 msgid "Precip unit" 202 233 msgstr "Nederbördsenhet" 203 234 204 #: admin/admin.php: 297235 #: admin/admin.php:340 205 236 msgid "Used for forecast day labels." 206 237 msgstr "Används för etiketter för prognosdagar." … … 275 306 msgstr "Kortkod" 276 307 277 #: admin/page-settings.php:91 admin/page-shortcodes.php:1 65308 #: admin/page-settings.php:91 admin/page-shortcodes.php:124 278 309 #: blocks/spelhubben-weather/index.js:84 279 310 msgid "Forecast" … … 284 315 msgstr "Broschyrkarta" 285 316 286 #: admin/page-shortcodes.php:2 7317 #: admin/page-shortcodes.php:20 287 318 msgid "Basic example" 288 319 msgstr "Grundläggande exempel" 289 320 290 #: admin/page-shortcodes.php:2 8321 #: admin/page-shortcodes.php:21 291 322 msgid "Compact with map & animation" 292 323 msgstr "Kompakt med karta och animation" 293 324 294 #: admin/page-shortcodes.php:2 9325 #: admin/page-shortcodes.php:22 295 326 msgid "Inline without map" 296 327 msgstr "Inline utan karta" 297 328 298 #: admin/page-shortcodes.php: 30329 #: admin/page-shortcodes.php:23 299 330 msgid "Detailed with daily forecast & km/h" 300 331 msgstr "Detaljerad med daglig prognos och km/h" 301 332 302 #: admin/page-shortcodes.php: 31333 #: admin/page-shortcodes.php:24 303 334 msgid "Only temperature + wind, imperial" 304 335 msgstr "Endast temperatur + vind, imperial" 305 336 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 327 338 msgid "Spelhubben Weather – Shortcodes" 328 339 msgstr "Spelhubben Väder – Kortkoder" 329 340 330 #: admin/page-shortcodes.php: 44341 #: admin/page-shortcodes.php:29 331 342 msgid "" 332 343 "Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your " … … 336 347 "till en kortkod i urklipp." 337 348 338 #: admin/page-shortcodes.php: 50 admin/page-shortcodes.php:204349 #: admin/page-shortcodes.php:35 admin/page-shortcodes.php:163 339 350 msgid "Back to Settings" 340 351 msgstr "Tillbaka till inställningar" 341 352 342 #: admin/page-shortcodes.php: 55353 #: admin/page-shortcodes.php:40 343 354 msgid "Search examples… e.g. inline, map, imperial" 344 355 msgstr "Sökexempel… t.ex. inline, map, imperial" 345 356 346 #: admin/page-shortcodes.php: 61357 #: admin/page-shortcodes.php:46 347 358 msgid "Copy all (visible)" 348 359 msgstr "Kopiera alla (synliga)" 349 360 350 #: admin/page-shortcodes.php: 71361 #: admin/page-shortcodes.php:56 351 362 msgid "Quick start – shortcodes" 352 363 msgstr "Snabbstart – kortkoder" 353 364 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 368 366 msgid "Preview" 369 367 msgstr "Förhandsvisning" 370 368 371 #: admin/page-shortcodes.php: 129369 #: admin/page-shortcodes.php:88 372 370 msgid "Click a snippet to send it here. You can edit, copy or expand the box." 373 371 msgstr "" … … 375 373 "expandera rutan." 376 374 377 #: admin/page-shortcodes.php: 137includes/i18n.php:47375 #: admin/page-shortcodes.php:96 includes/i18n.php:47 378 376 msgid "Clear" 379 377 msgstr "Klart" 380 378 381 #: admin/page-shortcodes.php:1 44379 #: admin/page-shortcodes.php:103 382 380 msgid "Shortcode preview" 383 381 msgstr "Förhandsvisning av kortkod" 384 382 385 #: admin/page-shortcodes.php:1 48383 #: admin/page-shortcodes.php:107 386 384 msgid "Live preview" 387 385 msgstr "Live-förhandsvisning" 388 386 389 #: admin/page-shortcodes.php:1 52387 #: admin/page-shortcodes.php:111 390 388 msgid "Shortcode live preview" 391 389 msgstr "Förhandsvisning av kortkod i realtid" 392 390 393 #: admin/page-shortcodes.php:1 59391 #: admin/page-shortcodes.php:118 394 392 msgid "Attributes – overview" 395 393 msgstr "Attribut – översikt" 396 394 397 #: admin/page-shortcodes.php:1 63blocks/spelhubben-weather/index.js:31395 #: admin/page-shortcodes.php:122 blocks/spelhubben-weather/index.js:31 398 396 msgid "Location" 399 397 msgstr "Plats" 400 398 401 #: admin/page-shortcodes.php:1 64blocks/spelhubben-weather/index.js:43399 #: admin/page-shortcodes.php:123 blocks/spelhubben-weather/index.js:43 402 400 msgid "Display" 403 401 msgstr "Visa" 404 402 405 #: admin/page-shortcodes.php:1 73403 #: admin/page-shortcodes.php:132 406 404 msgid "Attribute" 407 405 msgstr "Attribut" 408 406 409 #: admin/page-shortcodes.php:1 74407 #: admin/page-shortcodes.php:133 410 408 msgid "Description" 411 409 msgstr "Beskrivning" 412 410 413 #: admin/page-shortcodes.php:1 75411 #: admin/page-shortcodes.php:134 414 412 msgid "Example" 415 413 msgstr "Exempel" 416 414 417 #: admin/page-shortcodes.php:1 79415 #: admin/page-shortcodes.php:138 418 416 msgid "Place name to geocode (used if lat/lon are missing)." 419 417 msgstr "Ortsnamn att geokoda (används om latitud/longitud saknas)." 420 418 421 #: admin/page-shortcodes.php:1 80419 #: admin/page-shortcodes.php:139 422 420 msgid "Coordinates take precedence over place." 423 421 msgstr "Koordinater har företräde framför plats." 424 422 425 #: admin/page-shortcodes.php:1 82423 #: admin/page-shortcodes.php:141 426 424 msgid "Fields to display: temp,wind,icon" 427 425 msgstr "Fält att visa: temp, vind, ikon" 428 426 429 #: admin/page-shortcodes.php:1 83427 #: admin/page-shortcodes.php:142 430 428 msgid "inline | compact | card | detailed" 431 429 msgstr "inline | kompakt | kort | detaljerad" 432 430 433 #: admin/page-shortcodes.php:1 84431 #: admin/page-shortcodes.php:143 434 432 msgid "1/0 to show/hide map" 435 433 msgstr "1/0 för att visa/dölja kartan" 436 434 437 #: admin/page-shortcodes.php:1 85435 #: admin/page-shortcodes.php:144 438 436 msgid "Map height in px (min 120)." 439 437 msgstr "Karthöjd i px (minst 120)." 440 438 441 #: admin/page-shortcodes.php:1 86439 #: admin/page-shortcodes.php:145 442 440 msgid "openmeteo,smhi,yr,metno_nowcast (comma-separated)" 443 441 msgstr "openmeteo,smhi,yr,metno_nowcast (kommaseparerad)" 444 442 445 #: admin/page-shortcodes.php:1 87443 #: admin/page-shortcodes.php:146 446 444 msgid "1/0 – subtle animations" 447 445 msgstr "1/0 – subtila animationer" 448 446 449 #: admin/page-shortcodes.php:1 89447 #: admin/page-shortcodes.php:148 450 448 msgid "none | daily" 451 449 msgstr "ingen | dagligen" 452 450 453 #: admin/page-shortcodes.php:1 90451 #: admin/page-shortcodes.php:149 454 452 msgid "Number of days in the forecast (3–10)" 455 453 msgstr "Antal dagar i prognosen (3–10)" 456 454 457 #: admin/page-shortcodes.php:1 92455 #: admin/page-shortcodes.php:151 458 456 msgid "Preset: metric | metric_kmh | imperial" 459 457 msgstr "Förinställning: metrisk | metrisk_kmh | brittisk" 460 458 461 #: admin/page-shortcodes.php:1 93459 #: admin/page-shortcodes.php:152 462 460 msgid "Override temperature unit" 463 461 msgstr "Överstyrningstemperaturenhet" 464 462 465 #: admin/page-shortcodes.php:1 94463 #: admin/page-shortcodes.php:153 466 464 msgid "Override wind unit" 467 465 msgstr "Åsidosätt vindenheten" 468 466 469 #: admin/page-shortcodes.php:1 95467 #: admin/page-shortcodes.php:154 470 468 msgid "Override precipitation unit" 471 469 msgstr "Åsidosätt nederbördsenhet" 472 470 473 #: admin/page-shortcodes.php:1 96471 #: admin/page-shortcodes.php:155 474 472 msgid "Forecast date label (PHP date)" 475 473 msgstr "Prognosdatumetikett (PHP-datum)" … … 601 599 msgstr "Spelhubben Väder (äldre)" 602 600 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 604 603 #, php-format 605 msgid "Wind %s %s" 606 msgstr "Vind %s %s" 607 608 #: includes/class-renderer.php:128 includes/class-renderer.php:159 604 msgid "Wind %1$s %2$s" 605 msgstr "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 609 609 #, php-format 610 msgid "Wind: %s %s" 611 msgstr "Vind: %s %s" 612 613 #: includes/class-renderer.php:136 610 msgid "Wind: %1$s %2$s" 611 msgstr "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 614 615 #, php-format 615 msgid "Precipitation: %s %s" 616 msgstr "Nederbörd: %s %s" 617 618 #: includes/class-renderer.php:139 616 msgid "Precipitation: %1$s %2$s" 617 msgstr "Nederbörd: %1$s %2$s" 618 619 #. translators: %s: cloud cover percent (0–100) 620 #: includes/class-renderer.php:165 619 621 #, php-format 620 622 msgid "Cloud cover: %s%%" 621 623 msgstr "Molntäcke: %s%%" 622 624 623 #: includes/class-renderer.php: 178625 #: includes/class-renderer.php:211 624 626 msgid "View on OpenStreetMap" 625 627 msgstr "Visa på OpenStreetMap" 626 628 627 #: includes/class-sv-vader.php:53 629 #: includes/class-renderer.php:269 630 msgid "Provider Comparison" 631 msgstr "Leverantörsjämförelse" 632 633 #: includes/class-renderer.php:269 634 msgid "sources" 635 msgstr "källor" 636 637 #: includes/class-renderer.php:317 638 msgid "Note:" 639 msgstr "Notera:" 640 641 #: includes/class-renderer.php:318 642 msgid "" 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." 646 msgstr "" 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 628 652 msgid "Could not fetch weather data from the selected providers." 629 653 msgstr "Kunde inte hämta väderdata från de valda leverantörerna." 630 654 631 #: includes/class-sv-vader.php:1 06655 #: includes/class-sv-vader.php:188 632 656 msgid "Could not find the place." 633 657 msgstr "Kunde inte hitta platsen." 634 658 635 #: includes/i18n.php:48 includes/providers.php:125 659 #: includes/class-wporg-plugins.php:189 660 msgid "Could not fetch plugin list right now." 661 msgstr "Kunde inte hämta plugin-listan just nu." 662 663 #: includes/class-wporg-plugins.php:194 664 msgid "Retry" 665 msgstr "Försöka igen" 666 667 #: includes/class-wporg-plugins.php:200 668 msgid "No other plugins found." 669 msgstr "Inga andra plugin-program hittades." 670 671 #: includes/class-wporg-plugins.php:223 672 msgid "Other plugins by Spelhubben:" 673 msgstr "Andra plugins från Spelhubben:" 674 675 #: includes/class-wporg-plugins.php:281 676 msgid "Details" 677 msgstr "Detaljer" 678 679 #: includes/class-wporg-plugins.php:282 680 msgid "WP.org" 681 msgstr "WP.org" 682 683 #: includes/class-wporg-plugins.php:309 684 msgid "Active:" 685 msgstr "Aktiv:" 686 687 #: includes/class-wporg-plugins.php:314 688 msgid "Tested:" 689 msgstr "Testad:" 690 691 #: includes/class-wporg-plugins.php:315 692 msgid "Unknown" 693 msgstr "Okänd" 694 695 #: includes/i18n.php:48 includes/providers.php:248 636 696 msgid "Mostly clear" 637 697 msgstr "Mestadels klart" 638 698 639 #: includes/i18n.php:49 includes/providers.php: 126 includes/providers.php:196699 #: includes/i18n.php:49 includes/providers.php:249 includes/providers.php:319 640 700 msgid "Partly cloudy" 641 701 msgstr "Delvis molnigt" 642 702 643 #: includes/i18n.php:50 includes/providers.php: 127 includes/providers.php:198703 #: includes/i18n.php:50 includes/providers.php:250 includes/providers.php:321 644 704 msgid "Overcast" 645 705 msgstr "Mulet" 646 706 647 #: includes/i18n.php:51 includes/providers.php: 128707 #: includes/i18n.php:51 includes/providers.php:251 648 708 msgid "Fog" 649 709 msgstr "Dimma" … … 697 757 msgstr "Kraftigt snöfall" 698 758 699 #: includes/i18n.php:64 includes/providers.php: 141759 #: includes/i18n.php:64 includes/providers.php:264 700 760 msgid "Snow grains" 701 761 msgstr "Snökorn" … … 721 781 msgstr "Kraftiga snöbyar" 722 782 723 #: includes/i18n.php:70 includes/providers.php: 147783 #: includes/i18n.php:70 includes/providers.php:270 724 784 msgid "Thunderstorm" 725 785 msgstr "Åskväder" … … 733 793 msgstr "Åska (kraftig hagel)" 734 794 735 #: includes/providers.php: 124 includes/providers.php:194795 #: includes/providers.php:247 includes/providers.php:317 736 796 msgid "Clear sky" 737 797 msgstr "Klar himmel" 738 798 739 #: includes/providers.php: 129799 #: includes/providers.php:252 740 800 msgid "Depositing rime fog" 741 801 msgstr "Avsättning av rimdimma" 742 802 743 #: includes/providers.php: 130803 #: includes/providers.php:253 744 804 msgid "Drizzle: light" 745 805 msgstr "Duggregn: lätt" 746 806 747 #: includes/providers.php: 131807 #: includes/providers.php:254 748 808 msgid "Drizzle: moderate" 749 809 msgstr "Duggregn: måttligt" 750 810 751 #: includes/providers.php: 132811 #: includes/providers.php:255 752 812 msgid "Drizzle: dense" 753 813 msgstr "Duggregn: tätt" 754 814 755 #: includes/providers.php: 133815 #: includes/providers.php:256 756 816 msgid "Rain: light" 757 817 msgstr "Regn: lätt" 758 818 759 #: includes/providers.php: 134819 #: includes/providers.php:257 760 820 msgid "Rain: moderate" 761 821 msgstr "Regn: måttligt" 762 822 763 #: includes/providers.php: 135823 #: includes/providers.php:258 764 824 msgid "Rain: heavy" 765 825 msgstr "Regn: kraftigt" 766 826 767 #: includes/providers.php: 136827 #: includes/providers.php:259 768 828 msgid "Freezing rain: light" 769 829 msgstr "Underkylt regn: lätt" 770 830 771 #: includes/providers.php: 137831 #: includes/providers.php:260 772 832 msgid "Freezing rain: heavy" 773 833 msgstr "Underkylt regn: kraftigt" 774 834 775 #: includes/providers.php: 138835 #: includes/providers.php:261 776 836 msgid "Snowfall: light" 777 837 msgstr "Snöfall: lätt" 778 838 779 #: includes/providers.php: 139839 #: includes/providers.php:262 780 840 msgid "Snowfall: moderate" 781 841 msgstr "Snöfall: måttlig" 782 842 783 #: includes/providers.php: 140843 #: includes/providers.php:263 784 844 msgid "Snowfall: heavy" 785 845 msgstr "Snöfall: kraftigt" 786 846 787 #: includes/providers.php: 142847 #: includes/providers.php:265 788 848 msgid "Rain showers: slight" 789 849 msgstr "Regnskurar: lätta" 790 850 791 #: includes/providers.php: 143851 #: includes/providers.php:266 792 852 msgid "Rain showers: moderate" 793 853 msgstr "Regnskurar: måttliga" 794 854 795 #: includes/providers.php: 144855 #: includes/providers.php:267 796 856 msgid "Rain showers: violent" 797 857 msgstr "Regnskurar: våldsamma" 798 858 799 #: includes/providers.php: 145859 #: includes/providers.php:268 800 860 msgid "Snow showers: slight" 801 861 msgstr "Snöbyar: lätta" 802 862 803 #: includes/providers.php: 146863 #: includes/providers.php:269 804 864 msgid "Snow showers: heavy" 805 865 msgstr "Snöbyar: kraftiga" 806 866 807 #: includes/providers.php: 148867 #: includes/providers.php:271 808 868 msgid "Thunderstorm with slight hail" 809 869 msgstr "Åska med lätt hagel" 810 870 811 #: includes/providers.php: 149871 #: includes/providers.php:272 812 872 msgid "Thunderstorm with heavy hail" 813 873 msgstr "Åskväder med kraftig hagel" 814 874 815 #: includes/providers.php: 191875 #: includes/providers.php:314 816 876 msgid "Precipitation" 817 877 msgstr "Nederbörd" … … 833 893 msgstr "Spelhubben" 834 894 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 835 920 #~ msgid "Custom CSS class on the wrapper" 836 921 #~ msgstr "Anpassad CSS-klass på omslaget" -
spelhubben-weather/trunk/languages/spelhubben-weather.pot
r3372751 r3420396 3 3 msgstr "" 4 4 "Project-Id-Version: Spelhubben Weather\n" 5 "POT-Creation-Date: 2025-1 0-04 09:32+0200\n"5 "POT-Creation-Date: 2025-12-15 18:17+0100\n" 6 6 "PO-Revision-Date: 2025-09-27 19:36+0200\n" 7 7 "Last-Translator: \n" … … 11 11 "Content-Transfer-Encoding: 8bit\n" 12 12 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" 13 "X-Generator: Poedit 3. 7\n"13 "X-Generator: Poedit 3.8\n" 14 14 "X-Poedit-Basepath: ..\n" 15 15 "X-Poedit-Flags-xgettext: --add-comments=translators:\n" … … 22 22 "X-Poedit-SearchPathExcluded-1: assets/vendor\n" 23 23 24 #: admin/admin.php: 4924 #: admin/admin.php:55 25 25 msgid "Copied!" 26 26 msgstr "" 27 27 28 #: admin/admin.php:5 0 admin/page-shortcodes.php:8529 #: admin/page-shortcodes.php: 108 admin/page-shortcodes.php:13428 #: admin/admin.php:56 admin/page-shortcodes.php:68 29 #: admin/page-shortcodes.php:93 30 30 msgid "Copy" 31 31 msgstr "" 32 32 33 #: admin/admin.php:5 1 admin/page-shortcodes.php:14033 #: admin/admin.php:57 admin/page-shortcodes.php:99 34 34 msgid "Expand" 35 35 msgstr "" 36 36 37 #: admin/admin.php:5 237 #: admin/admin.php:58 38 38 msgid "Collapse" 39 39 msgstr "" 40 40 41 #: admin/admin.php:5 341 #: admin/admin.php:59 42 42 msgid "Rendering…" 43 43 msgstr "" 44 44 45 #: admin/admin.php: 5445 #: admin/admin.php:60 46 46 msgid "OK" 47 47 msgstr "" 48 48 49 #: admin/admin.php: 5549 #: admin/admin.php:61 50 50 msgid "Failed" 51 51 msgstr "" 52 52 53 #: admin/admin.php: 5653 #: admin/admin.php:62 54 54 msgid "Preview failed" 55 55 msgstr "" 56 56 57 57 #. Plugin Name of the plugin/theme 58 #: admin/admin.php: 87 admin/admin.php:88includes/Widget/class-widget.php:1958 #: admin/admin.php:93 admin/admin.php:94 includes/Widget/class-widget.php:19 59 59 msgid "Spelhubben Weather" 60 60 msgstr "" 61 61 62 #: admin/admin.php: 99 admin/admin.php:100 includes/class-plugin.php:11462 #: admin/admin.php:105 admin/admin.php:106 includes/class-plugin.php:104 63 63 msgid "Settings" 64 64 msgstr "" 65 65 66 #: admin/admin.php:1 09 admin/admin.php:11066 #: admin/admin.php:115 admin/admin.php:116 67 67 msgid "Shortcodes" 68 68 msgstr "" 69 69 70 #: admin/admin.php:13 2admin/page-settings.php:4470 #: admin/admin.php:138 admin/page-settings.php:44 71 71 msgid "Default settings" 72 72 msgstr "" 73 73 74 #: admin/admin.php:1 3474 #: admin/admin.php:140 75 75 msgid "Default place" 76 76 msgstr "" 77 77 78 #: admin/admin.php:1 3578 #: admin/admin.php:141 79 79 msgid "Cache TTL (minutes)" 80 80 msgstr "" 81 81 82 #: admin/admin.php:1 3682 #: admin/admin.php:142 83 83 msgid "Default fields" 84 84 msgstr "" 85 85 86 #: admin/admin.php:1 3786 #: admin/admin.php:143 87 87 msgid "Default layout" 88 88 msgstr "" 89 89 90 #: admin/admin.php:1 3890 #: admin/admin.php:144 91 91 msgid "Show map by default" 92 92 msgstr "" 93 93 94 #: admin/admin.php:1 39blocks/spelhubben-weather/index.js:5994 #: admin/admin.php:145 blocks/spelhubben-weather/index.js:59 95 95 msgid "Map height (px)" 96 96 msgstr "" 97 97 98 #: admin/admin.php:140 98 #: admin/admin.php:146 99 msgid "Icon style" 100 msgstr "" 101 102 #: admin/admin.php:147 99 103 msgid "Data providers" 100 104 msgstr "" 101 105 102 #: admin/admin.php:14 1106 #: admin/admin.php:148 103 107 msgid "Yr contact/UA" 104 108 msgstr "" 105 109 106 #: admin/admin.php:1 44 admin/page-shortcodes.php:166110 #: admin/admin.php:151 admin/page-shortcodes.php:125 107 111 #: blocks/spelhubben-weather/index.js:68 108 112 msgid "Units & format" 109 113 msgstr "" 110 114 111 #: admin/admin.php:1 45blocks/spelhubben-weather/index.js:70115 #: admin/admin.php:152 blocks/spelhubben-weather/index.js:70 112 116 msgid "Preset" 113 117 msgstr "" 114 118 115 #: admin/admin.php:1 46119 #: admin/admin.php:153 116 120 msgid "Overrides (optional)" 117 121 msgstr "" 118 122 119 #: admin/admin.php:1 47123 #: admin/admin.php:154 120 124 msgid "Date format (PHP)" 121 125 msgstr "" 122 126 123 #: admin/admin.php:1 57blocks/spelhubben-weather/index.js:36127 #: admin/admin.php:164 blocks/spelhubben-weather/index.js:36 124 128 msgid "e.g. Stockholm" 125 129 msgstr "" 126 130 127 #: admin/admin.php:17 1131 #: admin/admin.php:178 128 132 msgid "How long weather data is cached (transients)." 129 133 msgstr "" 130 134 131 #: admin/admin.php:18 0135 #: admin/admin.php:187 132 136 msgid "Comma-separated: temp,wind,icon" 133 137 msgstr "" 134 138 135 #: admin/admin.php:1 86139 #: admin/admin.php:193 136 140 msgctxt "layout label" 137 141 msgid "Inline" 138 142 msgstr "" 139 143 140 #: admin/admin.php:1 87144 #: admin/admin.php:194 141 145 msgctxt "layout label" 142 146 msgid "Compact" 143 147 msgstr "" 144 148 145 #: admin/admin.php:1 88149 #: admin/admin.php:195 146 150 msgctxt "layout label" 147 151 msgid "Card" 148 152 msgstr "" 149 153 150 #: admin/admin.php:1 89154 #: admin/admin.php:196 151 155 msgctxt "layout label" 152 156 msgid "Detailed" 153 157 msgstr "" 154 158 155 #: admin/admin.php:2 08159 #: admin/admin.php:215 156 160 msgid "Enable map as default." 157 161 msgstr "" 158 162 159 #: admin/admin.php:225 163 #: admin/admin.php:230 164 msgid "Classic" 165 msgstr "" 166 167 #: admin/admin.php:231 168 msgid "Modern Flat" 169 msgstr "" 170 171 #: admin/admin.php:232 172 msgid "Modern Gradient" 173 msgstr "" 174 175 #: admin/admin.php:244 176 msgid "Choose your preferred weather icon theme." 177 msgstr "" 178 179 #: admin/admin.php:252 160 180 msgid "Open-Meteo" 161 181 msgstr "" 162 182 163 #: admin/admin.php:2 30183 #: admin/admin.php:257 164 184 msgid "SMHI" 165 185 msgstr "" 166 186 167 #: admin/admin.php:2 35187 #: admin/admin.php:262 168 188 msgid "Yr (MET Norway)" 169 189 msgstr "" 170 190 171 #: admin/admin.php:2 40191 #: admin/admin.php:267 172 192 msgid "MET Norway Nowcast" 173 193 msgstr "" 174 194 175 #: admin/admin.php:250 195 #: admin/admin.php:273 196 msgid "FMI (Finland, Open Data)" 197 msgstr "" 198 199 #: admin/admin.php:278 200 msgid "Open-Weathermap" 201 msgstr "" 202 203 #: admin/admin.php:283 204 msgid "Weatherapi.com" 205 msgstr "" 206 207 #: admin/admin.php:293 176 208 msgid "Recommended by MET Norway: include an email or URL in your User-Agent." 177 209 msgstr "" 178 210 179 #: admin/admin.php:2 56blocks/spelhubben-weather/index.js:16211 #: admin/admin.php:299 blocks/spelhubben-weather/index.js:16 180 212 msgid "Metric (°C, m/s, mm)" 181 213 msgstr "" 182 214 183 #: admin/admin.php: 257blocks/spelhubben-weather/index.js:17215 #: admin/admin.php:300 blocks/spelhubben-weather/index.js:17 184 216 msgid "Metric (°C, km/h, mm)" 185 217 msgstr "" 186 218 187 #: admin/admin.php: 258blocks/spelhubben-weather/index.js:18219 #: admin/admin.php:301 blocks/spelhubben-weather/index.js:18 188 220 msgid "Imperial (°F, mph, in)" 189 221 msgstr "" 190 222 191 #: admin/admin.php: 276223 #: admin/admin.php:319 192 224 msgid "Temp unit" 193 225 msgstr "" 194 226 195 #: admin/admin.php: 281227 #: admin/admin.php:324 196 228 msgid "Wind unit" 197 229 msgstr "" 198 230 199 #: admin/admin.php: 286231 #: admin/admin.php:329 200 232 msgid "Precip unit" 201 233 msgstr "" 202 234 203 #: admin/admin.php: 297235 #: admin/admin.php:340 204 236 msgid "Used for forecast day labels." 205 237 msgstr "" … … 268 300 msgstr "" 269 301 270 #: admin/page-settings.php:91 admin/page-shortcodes.php:1 65302 #: admin/page-settings.php:91 admin/page-shortcodes.php:124 271 303 #: blocks/spelhubben-weather/index.js:84 272 304 msgid "Forecast" … … 277 309 msgstr "" 278 310 279 #: admin/page-shortcodes.php:2 7311 #: admin/page-shortcodes.php:20 280 312 msgid "Basic example" 281 313 msgstr "" 282 314 315 #: admin/page-shortcodes.php:21 316 msgid "Compact with map & animation" 317 msgstr "" 318 319 #: admin/page-shortcodes.php:22 320 msgid "Inline without map" 321 msgstr "" 322 323 #: admin/page-shortcodes.php:23 324 msgid "Detailed with daily forecast & km/h" 325 msgstr "" 326 327 #: admin/page-shortcodes.php:24 328 msgid "Only temperature + wind, imperial" 329 msgstr "" 330 283 331 #: admin/page-shortcodes.php:28 284 msgid " Compact with map & animation"332 msgid "Spelhubben Weather – Shortcodes" 285 333 msgstr "" 286 334 287 335 #: admin/page-shortcodes.php:29 288 msgid "Inline without map"289 msgstr ""290 291 #: admin/page-shortcodes.php:30292 msgid "Detailed with daily forecast & km/h"293 msgstr ""294 295 #: admin/page-shortcodes.php:31296 msgid "Only temperature + wind, imperial"297 msgstr ""298 299 #: admin/page-shortcodes.php:35300 msgid "Basic example (legacy)"301 msgstr ""302 303 #: admin/page-shortcodes.php:36304 msgid "Compact with map & animation (legacy)"305 msgstr ""306 307 #: admin/page-shortcodes.php:37308 msgid "Inline without map (legacy)"309 msgstr ""310 311 #: admin/page-shortcodes.php:38312 msgid "Detailed with daily forecast & all providers (legacy)"313 msgstr ""314 315 #: admin/page-shortcodes.php:39316 msgid "Only temperature + wind, no map (legacy)"317 msgstr ""318 319 #: admin/page-shortcodes.php:43320 msgid "Spelhubben Weather – Shortcodes"321 msgstr ""322 323 #: admin/page-shortcodes.php:44324 336 msgid "" 325 337 "Copy & paste ready-made snippets. Click “Copy” to put a shortcode on your " … … 327 339 msgstr "" 328 340 329 #: admin/page-shortcodes.php: 50 admin/page-shortcodes.php:204341 #: admin/page-shortcodes.php:35 admin/page-shortcodes.php:163 330 342 msgid "Back to Settings" 331 343 msgstr "" 332 344 333 #: admin/page-shortcodes.php: 55345 #: admin/page-shortcodes.php:40 334 346 msgid "Search examples… e.g. inline, map, imperial" 335 347 msgstr "" 336 348 337 #: admin/page-shortcodes.php: 61349 #: admin/page-shortcodes.php:46 338 350 msgid "Copy all (visible)" 339 351 msgstr "" 340 352 341 #: admin/page-shortcodes.php: 71353 #: admin/page-shortcodes.php:56 342 354 msgid "Quick start – shortcodes" 343 355 msgstr "" 344 356 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 358 358 msgid "Preview" 359 359 msgstr "" 360 360 361 #: admin/page-shortcodes.php: 129361 #: admin/page-shortcodes.php:88 362 362 msgid "Click a snippet to send it here. You can edit, copy or expand the box." 363 363 msgstr "" 364 364 365 #: admin/page-shortcodes.php: 137includes/i18n.php:47365 #: admin/page-shortcodes.php:96 includes/i18n.php:47 366 366 msgid "Clear" 367 367 msgstr "" 368 368 369 #: admin/page-shortcodes.php:103 370 msgid "Shortcode preview" 371 msgstr "" 372 373 #: admin/page-shortcodes.php:107 374 msgid "Live preview" 375 msgstr "" 376 377 #: admin/page-shortcodes.php:111 378 msgid "Shortcode live preview" 379 msgstr "" 380 381 #: admin/page-shortcodes.php:118 382 msgid "Attributes – overview" 383 msgstr "" 384 385 #: admin/page-shortcodes.php:122 blocks/spelhubben-weather/index.js:31 386 msgid "Location" 387 msgstr "" 388 389 #: admin/page-shortcodes.php:123 blocks/spelhubben-weather/index.js:43 390 msgid "Display" 391 msgstr "" 392 393 #: admin/page-shortcodes.php:132 394 msgid "Attribute" 395 msgstr "" 396 397 #: admin/page-shortcodes.php:133 398 msgid "Description" 399 msgstr "" 400 401 #: admin/page-shortcodes.php:134 402 msgid "Example" 403 msgstr "" 404 405 #: admin/page-shortcodes.php:138 406 msgid "Place name to geocode (used if lat/lon are missing)." 407 msgstr "" 408 409 #: admin/page-shortcodes.php:139 410 msgid "Coordinates take precedence over place." 411 msgstr "" 412 413 #: admin/page-shortcodes.php:141 414 msgid "Fields to display: temp,wind,icon" 415 msgstr "" 416 417 #: admin/page-shortcodes.php:142 418 msgid "inline | compact | card | detailed" 419 msgstr "" 420 421 #: admin/page-shortcodes.php:143 422 msgid "1/0 to show/hide map" 423 msgstr "" 424 369 425 #: admin/page-shortcodes.php:144 370 msgid "Shortcode preview" 426 msgid "Map height in px (min 120)." 427 msgstr "" 428 429 #: admin/page-shortcodes.php:145 430 msgid "openmeteo,smhi,yr,metno_nowcast (comma-separated)" 431 msgstr "" 432 433 #: admin/page-shortcodes.php:146 434 msgid "1/0 – subtle animations" 371 435 msgstr "" 372 436 373 437 #: admin/page-shortcodes.php:148 374 msgid "Live preview" 438 msgid "none | daily" 439 msgstr "" 440 441 #: admin/page-shortcodes.php:149 442 msgid "Number of days in the forecast (3–10)" 443 msgstr "" 444 445 #: admin/page-shortcodes.php:151 446 msgid "Preset: metric | metric_kmh | imperial" 375 447 msgstr "" 376 448 377 449 #: admin/page-shortcodes.php:152 378 msgid "Shortcode live preview"379 msgstr ""380 381 #: admin/page-shortcodes.php:159382 msgid "Attributes – overview"383 msgstr ""384 385 #: admin/page-shortcodes.php:163 blocks/spelhubben-weather/index.js:31386 msgid "Location"387 msgstr ""388 389 #: admin/page-shortcodes.php:164 blocks/spelhubben-weather/index.js:43390 msgid "Display"391 msgstr ""392 393 #: admin/page-shortcodes.php:173394 msgid "Attribute"395 msgstr ""396 397 #: admin/page-shortcodes.php:174398 msgid "Description"399 msgstr ""400 401 #: admin/page-shortcodes.php:175402 msgid "Example"403 msgstr ""404 405 #: admin/page-shortcodes.php:179406 msgid "Place name to geocode (used if lat/lon are missing)."407 msgstr ""408 409 #: admin/page-shortcodes.php:180410 msgid "Coordinates take precedence over place."411 msgstr ""412 413 #: admin/page-shortcodes.php:182414 msgid "Fields to display: temp,wind,icon"415 msgstr ""416 417 #: admin/page-shortcodes.php:183418 msgid "inline | compact | card | detailed"419 msgstr ""420 421 #: admin/page-shortcodes.php:184422 msgid "1/0 to show/hide map"423 msgstr ""424 425 #: admin/page-shortcodes.php:185426 msgid "Map height in px (min 120)."427 msgstr ""428 429 #: admin/page-shortcodes.php:186430 msgid "openmeteo,smhi,yr,metno_nowcast (comma-separated)"431 msgstr ""432 433 #: admin/page-shortcodes.php:187434 msgid "1/0 – subtle animations"435 msgstr ""436 437 #: admin/page-shortcodes.php:189438 msgid "none | daily"439 msgstr ""440 441 #: admin/page-shortcodes.php:190442 msgid "Number of days in the forecast (3–10)"443 msgstr ""444 445 #: admin/page-shortcodes.php:192446 msgid "Preset: metric | metric_kmh | imperial"447 msgstr ""448 449 #: admin/page-shortcodes.php:193450 450 msgid "Override temperature unit" 451 451 msgstr "" 452 452 453 #: admin/page-shortcodes.php:1 94453 #: admin/page-shortcodes.php:153 454 454 msgid "Override wind unit" 455 455 msgstr "" 456 456 457 #: admin/page-shortcodes.php:1 95457 #: admin/page-shortcodes.php:154 458 458 msgid "Override precipitation unit" 459 459 msgstr "" 460 460 461 #: admin/page-shortcodes.php:1 96461 #: admin/page-shortcodes.php:155 462 462 msgid "Forecast date label (PHP date)" 463 463 msgstr "" … … 587 587 msgstr "" 588 588 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 590 591 #, php-format 591 msgid "Wind %s %s" 592 msgstr "" 593 594 #: includes/class-renderer.php:128 includes/class-renderer.php:159 592 msgid "Wind %1$s %2$s" 593 msgstr "" 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 595 597 #, php-format 596 msgid "Wind: %s %s" 597 msgstr "" 598 599 #: includes/class-renderer.php:136 598 msgid "Wind: %1$s %2$s" 599 msgstr "" 600 601 #. translators: 1: precipitation value, 2: precipitation unit (e.g. 1.2, mm) 602 #: includes/class-renderer.php:158 600 603 #, php-format 601 msgid "Precipitation: %s %s" 602 msgstr "" 603 604 #: includes/class-renderer.php:139 604 msgid "Precipitation: %1$s %2$s" 605 msgstr "" 606 607 #. translators: %s: cloud cover percent (0–100) 608 #: includes/class-renderer.php:165 605 609 #, php-format 606 610 msgid "Cloud cover: %s%%" 607 611 msgstr "" 608 612 609 #: includes/class-renderer.php: 178613 #: includes/class-renderer.php:211 610 614 msgid "View on OpenStreetMap" 611 615 msgstr "" 612 616 613 #: includes/class-sv-vader.php:53 617 #: includes/class-renderer.php:269 618 msgid "Provider Comparison" 619 msgstr "" 620 621 #: includes/class-renderer.php:269 622 msgid "sources" 623 msgstr "" 624 625 #: includes/class-renderer.php:317 626 msgid "Note:" 627 msgstr "" 628 629 #: includes/class-renderer.php:318 630 msgid "" 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." 634 msgstr "" 635 636 #: includes/class-sv-vader.php:65 614 637 msgid "Could not fetch weather data from the selected providers." 615 638 msgstr "" 616 639 617 #: includes/class-sv-vader.php:1 06640 #: includes/class-sv-vader.php:188 618 641 msgid "Could not find the place." 619 642 msgstr "" 620 643 621 #: includes/i18n.php:48 includes/providers.php:125 644 #: includes/class-wporg-plugins.php:189 645 msgid "Could not fetch plugin list right now." 646 msgstr "" 647 648 #: includes/class-wporg-plugins.php:194 649 msgid "Retry" 650 msgstr "" 651 652 #: includes/class-wporg-plugins.php:200 653 msgid "No other plugins found." 654 msgstr "" 655 656 #: includes/class-wporg-plugins.php:223 657 msgid "Other plugins by Spelhubben:" 658 msgstr "" 659 660 #: includes/class-wporg-plugins.php:281 661 msgid "Details" 662 msgstr "" 663 664 #: includes/class-wporg-plugins.php:282 665 msgid "WP.org" 666 msgstr "" 667 668 #: includes/class-wporg-plugins.php:309 669 msgid "Active:" 670 msgstr "" 671 672 #: includes/class-wporg-plugins.php:314 673 msgid "Tested:" 674 msgstr "" 675 676 #: includes/class-wporg-plugins.php:315 677 msgid "Unknown" 678 msgstr "" 679 680 #: includes/i18n.php:48 includes/providers.php:248 622 681 msgid "Mostly clear" 623 682 msgstr "" 624 683 625 #: includes/i18n.php:49 includes/providers.php: 126 includes/providers.php:196684 #: includes/i18n.php:49 includes/providers.php:249 includes/providers.php:319 626 685 msgid "Partly cloudy" 627 686 msgstr "" 628 687 629 #: includes/i18n.php:50 includes/providers.php: 127 includes/providers.php:198688 #: includes/i18n.php:50 includes/providers.php:250 includes/providers.php:321 630 689 msgid "Overcast" 631 690 msgstr "" 632 691 633 #: includes/i18n.php:51 includes/providers.php: 128692 #: includes/i18n.php:51 includes/providers.php:251 634 693 msgid "Fog" 635 694 msgstr "" … … 683 742 msgstr "" 684 743 685 #: includes/i18n.php:64 includes/providers.php: 141744 #: includes/i18n.php:64 includes/providers.php:264 686 745 msgid "Snow grains" 687 746 msgstr "" … … 707 766 msgstr "" 708 767 709 #: includes/i18n.php:70 includes/providers.php: 147768 #: includes/i18n.php:70 includes/providers.php:270 710 769 msgid "Thunderstorm" 711 770 msgstr "" … … 719 778 msgstr "" 720 779 721 #: includes/providers.php: 124 includes/providers.php:194780 #: includes/providers.php:247 includes/providers.php:317 722 781 msgid "Clear sky" 723 782 msgstr "" 724 783 725 #: includes/providers.php: 129784 #: includes/providers.php:252 726 785 msgid "Depositing rime fog" 727 786 msgstr "" 728 787 729 #: includes/providers.php: 130788 #: includes/providers.php:253 730 789 msgid "Drizzle: light" 731 790 msgstr "" 732 791 733 #: includes/providers.php: 131792 #: includes/providers.php:254 734 793 msgid "Drizzle: moderate" 735 794 msgstr "" 736 795 737 #: includes/providers.php: 132796 #: includes/providers.php:255 738 797 msgid "Drizzle: dense" 739 798 msgstr "" 740 799 741 #: includes/providers.php: 133800 #: includes/providers.php:256 742 801 msgid "Rain: light" 743 802 msgstr "" 744 803 745 #: includes/providers.php: 134804 #: includes/providers.php:257 746 805 msgid "Rain: moderate" 747 806 msgstr "" 748 807 749 #: includes/providers.php: 135808 #: includes/providers.php:258 750 809 msgid "Rain: heavy" 751 810 msgstr "" 752 811 753 #: includes/providers.php: 136812 #: includes/providers.php:259 754 813 msgid "Freezing rain: light" 755 814 msgstr "" 756 815 757 #: includes/providers.php: 137816 #: includes/providers.php:260 758 817 msgid "Freezing rain: heavy" 759 818 msgstr "" 760 819 761 #: includes/providers.php: 138820 #: includes/providers.php:261 762 821 msgid "Snowfall: light" 763 822 msgstr "" 764 823 765 #: includes/providers.php: 139824 #: includes/providers.php:262 766 825 msgid "Snowfall: moderate" 767 826 msgstr "" 768 827 769 #: includes/providers.php: 140828 #: includes/providers.php:263 770 829 msgid "Snowfall: heavy" 771 830 msgstr "" 772 831 773 #: includes/providers.php: 142832 #: includes/providers.php:265 774 833 msgid "Rain showers: slight" 775 834 msgstr "" 776 835 777 #: includes/providers.php: 143836 #: includes/providers.php:266 778 837 msgid "Rain showers: moderate" 779 838 msgstr "" 780 839 781 #: includes/providers.php: 144840 #: includes/providers.php:267 782 841 msgid "Rain showers: violent" 783 842 msgstr "" 784 843 785 #: includes/providers.php: 145844 #: includes/providers.php:268 786 845 msgid "Snow showers: slight" 787 846 msgstr "" 788 847 789 #: includes/providers.php: 146848 #: includes/providers.php:269 790 849 msgid "Snow showers: heavy" 791 850 msgstr "" 792 851 793 #: includes/providers.php: 148852 #: includes/providers.php:271 794 853 msgid "Thunderstorm with slight hail" 795 854 msgstr "" 796 855 797 #: includes/providers.php: 149856 #: includes/providers.php:272 798 857 msgid "Thunderstorm with heavy hail" 799 858 msgstr "" 800 859 801 #: includes/providers.php: 191860 #: includes/providers.php:314 802 861 msgid "Precipitation" 803 862 msgstr "" -
spelhubben-weather/trunk/readme.txt
r3408284 r3420396 5 5 Tested up to: 6.9 6 6 Requires PHP: 7.4 7 Stable tag: 1. 7.57 Stable tag: 1.8.1 8 8 Donate link: https://www.paypal.com/donate/?hosted_button_id=CV74CEXY5XEAU 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html 11 11 12 Weather widget & block with optional map and daily forecast. Can combine Open-Meteo, SMHI, Yr/MET and FMIdata.12 Weather widget & block with optional map and daily forecast. Can combine Open-Meteo, SMHI, Yr/MET, FMI, Open-Weathermap, and Weatherapi.com data. 13 13 14 14 == 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.15 This 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. 16 16 17 17 **Features** … … 70 70 = How do layouts work? = 71 71 Choose `layout="inline|compact|card|detailed"`. “Detailed” supports the multi-day forecast row. 72 = Can I see individual provider data (for comparison)? = 73 Yes! Use `comparison="1"` to show all enabled providers' data side-by-side. Useful for debugging or comparing which providers are available in your location. 74 Example: `[spelhubben_weather place="Stockholm" comparison="1" providers="openmeteo,smhi,yr,fmi,openweathermap,weatherapi"]` 75 76 = What icon themes are available? = 77 Three 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. 72 78 73 79 = How do I enable the map and set its size? = … … 104 110 - Rate limiting: reduce refreshes or increase cache TTL. 105 111 106 = Legacy shortcode? =107 `[sv_vader …]` is still accepted for compatibility, but **deprecated** and will be removed soon. Please switch to `[spelhubben_weather …]`.108 112 109 113 == Screenshots == … … 113 117 114 118 == 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 115 139 = 1.7.5 = 116 140 - Tested up to: 6.9 … … 137 161 138 162 == 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 139 166 = 1.7.5 = 140 167 Adds **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 3 3 * Plugin Name: Spelhubben Weather 4 4 * 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.55 * Version: 1.8.1 6 6 * Author: Spelhubben 7 7 * Text Domain: spelhubben-weather … … 19 19 // ── Constants (kept for backward compatibility). 20 20 if ( ! defined( 'SV_VADER_VER' ) ) { 21 define( 'SV_VADER_VER', '1. 7.5' );21 define( 'SV_VADER_VER', '1.8.1' ); 22 22 } 23 23 if ( ! defined( 'SV_VADER_DIR' ) ) { … … 59 59 require_once SV_VADER_DIR . 'includes/options.php'; 60 60 require_once SV_VADER_DIR . 'includes/format.php'; // NEW: Units & formatting helpers 61 require_once SV_VADER_DIR . 'includes/class-wporg-plugins.php'; // WP.org plugin showcase 61 62 require_once SV_VADER_DIR . 'includes/class-sv-vader.php'; // API/service layer. 62 63 63 64 if ( 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; 67 68 } 68 69 } 69 70 70 71 // ── 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'; 73 if ( file_exists( $sv_vader_widget_file ) ) { 74 require_once $sv_vader_widget_file; 74 75 } 75 76 -
spelhubben-weather/trunk/uninstall.php
r3372751 r3420396 17 17 * Prefer API deletes to avoid raw SQL. 18 18 */ 19 $ option_keys = array(19 $sv_vader_option_keys = array( 20 20 // Legacy 21 21 'sv_vader_options', … … 27 27 ); 28 28 29 foreach ( $ option_keys as $key ) {30 delete_option( $ key );31 delete_site_option( $ key );29 foreach ( $sv_vader_option_keys as $sv_vader_key ) { 30 delete_option( $sv_vader_key ); 31 delete_site_option( $sv_vader_key ); 32 32 } 33 33 … … 36 36 * These are safe API calls. 37 37 */ 38 $ transient_keys = array(38 $sv_vader_transient_keys = array( 39 39 'sv_vader_forecast_cache', 40 40 'spelhubben_weather_forecast_cache', 41 41 ); 42 foreach ( $ transient_keys as $t ) {43 delete_transient( $ t );44 delete_site_transient( $ t );42 foreach ( $sv_vader_transient_keys as $sv_vader_t ) { 43 delete_transient( $sv_vader_t ); 44 delete_site_transient( $sv_vader_t ); 45 45 } 46 46 … … 59 59 60 60 // Raw prefixes (without %). We'll escape with esc_like() and add '%'. 61 $ option_prefixes = array(61 $sv_vader_option_prefixes = array( 62 62 // Legacy 63 63 'sv_vader_', … … 74 74 75 75 // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching 76 foreach ( $ option_prefixes as $raw_prefix ) {77 $ like = $wpdb->esc_like( $raw_prefix ) . '%';76 foreach ( $sv_vader_option_prefixes as $sv_vader_raw_prefix ) { 77 $sv_vader_like = $wpdb->esc_like( $sv_vader_raw_prefix ) . '%'; 78 78 79 79 // Allowed table-property interpolation ($wpdb->options) + prepared LIKE. … … 81 81 $wpdb->prepare( 82 82 "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s", 83 $ like83 $sv_vader_like 84 84 ) 85 85 ); … … 94 94 // Multisite: sitemeta transients/prefixes + option-like keys 95 95 if ( is_multisite() && ! empty( $wpdb->sitemeta ) ) { 96 $s ite_prefixes = array(96 $sv_vader_site_prefixes = array( 97 97 '_site_transient_sv_vader_', 98 98 '_site_transient_timeout_sv_vader_', … … 106 106 ); 107 107 108 foreach ( $s ite_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 ) . '%'; 110 110 111 111 // Allowed table-property interpolation ($wpdb->sitemeta) + prepared LIKE. 112 $ meta_keys = $wpdb->get_col(112 $sv_vader_meta_keys = $wpdb->get_col( 113 113 $wpdb->prepare( 114 114 "SELECT meta_key FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s", 115 $ like115 $sv_vader_like 116 116 ) 117 117 ); 118 118 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 ) { 121 121 // Works for *_site_transient_* and site options keys. 122 delete_site_option( $ meta_key );122 delete_site_option( $sv_vader_meta_key ); 123 123 } 124 124 } … … 131 131 */ 132 132 if ( function_exists( '_get_cron_array' ) ) { 133 $ prefixes = array(133 $sv_vader_prefixes = array( 134 134 'sv_vader_', 135 135 'sv-vader-', … … 138 138 ); 139 139 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 ) ) { 144 144 continue; 145 145 } 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 ); 151 151 } 152 152 break;
Note: See TracChangeset
for help on using the changeset viewer.