Explorar o código

studiou-wc-custom-reports: add translations

Dalibor Votruba hai 1 ano
pai
achega
8d25ec9582

+ 3 - 1
studiou-wc-custom-reports/directory_structure.txt

@@ -1,5 +1,5 @@
 Project Directory Structure 
-Generated on: 16.06.2025  9:42:33,86 
+Generated on: 16.06.2025 11:50:11,49 
 Root: d:\Projects\quadarax\qdr.app\qdr.app.woo.plugins\studiou-wc-custom-reports 
  
 directory_structure.txt 
@@ -17,3 +17,5 @@ includes/
   class-report-factory.php 
   class-settings-manager.php 
   class-utils.php 
+languages/ 
+  studiou-wc-custom-reports-cs_CZ.po 

+ 20 - 8
studiou-wc-custom-reports/includes/class-admin-view.php

@@ -151,7 +151,7 @@ class StudiouWC_Admin_View {
             </table>
             
             <p class="submit">
-                <input type="submit" name="filter" class="button-primary" value="<?php _e('Filter', StudiouWC_Main::get_text_domain()); ?>">
+                <input type="submit" name="filter" class="button-primary" value="<?php esc_attr_e('Filter', StudiouWC_Main::get_text_domain()); ?>">
                 <button type="button" id="export-csv" class="button"><?php _e('Export', StudiouWC_Main::get_text_domain()); ?></button>
             </p>
         </form>
@@ -186,17 +186,23 @@ class StudiouWC_Admin_View {
         ?>
         <div class="tablenav top">
             <div class="tablenav-pages">
-                <span class="displaying-num"><?php printf(__('%d items', StudiouWC_Main::get_text_domain()), $total_items); ?></span>
+                <span class="displaying-num"><?php 
+                    /* translators: %d: number of items */
+                    printf(_n('%d item', '%d items', $total_items, StudiouWC_Main::get_text_domain()), $total_items); 
+                ?></span>
                 <?php if ($total_pages > 1): ?>
                 <span class="pagination-links">
                     <?php if ($paged > 1): ?>
-                    <a class="prev-page button" href="<?php echo esc_url(add_query_arg('paged', $paged - 1)); ?>"><?php _e('‹', StudiouWC_Main::get_text_domain()); ?></a>
+                    <a class="prev-page button" href="<?php echo esc_url(add_query_arg('paged', $paged - 1)); ?>" title="<?php esc_attr_e('Previous', StudiouWC_Main::get_text_domain()); ?>"><?php _e('‹', StudiouWC_Main::get_text_domain()); ?></a>
                     <?php endif; ?>
                     <span class="paging-input">
-                        <span class="tablenav-paging-text"><?php printf(__('%1$d of %2$d', StudiouWC_Main::get_text_domain()), $paged, $total_pages); ?></span>
+                        <span class="tablenav-paging-text"><?php 
+                            /* translators: 1: current page number, 2: total number of pages */
+                            printf(__('%1$d of %2$d', StudiouWC_Main::get_text_domain()), $paged, $total_pages); 
+                        ?></span>
                     </span>
                     <?php if ($paged < $total_pages): ?>
-                    <a class="next-page button" href="<?php echo esc_url(add_query_arg('paged', $paged + 1)); ?>"><?php _e('›', StudiouWC_Main::get_text_domain()); ?></a>
+                    <a class="next-page button" href="<?php echo esc_url(add_query_arg('paged', $paged + 1)); ?>" title="<?php esc_attr_e('Next', StudiouWC_Main::get_text_domain()); ?>"><?php _e('›', StudiouWC_Main::get_text_domain()); ?></a>
                     <?php endif; ?>
                 </span>
                 <?php endif; ?>
@@ -220,7 +226,10 @@ class StudiouWC_Admin_View {
                     <th><a href="<?php echo esc_url(add_query_arg(array('orderby' => 'category', 'order' => $order === 'ASC' ? 'DESC' : 'ASC'))); ?>"><?php _e('Product Category', StudiouWC_Main::get_text_domain()); ?></a></th>
                     <th><a href="<?php echo esc_url(add_query_arg(array('orderby' => 'orders_count', 'order' => $order === 'ASC' ? 'DESC' : 'ASC'))); ?>"><?php _e('Orders Count', StudiouWC_Main::get_text_domain()); ?></a></th>
                     <?php foreach ($property_values as $slug => $name): ?>
-                        <th><?php echo esc_html($name . ' Count'); ?></th>
+                        <th><?php 
+                            /* translators: %s: property name */
+                            printf(__('%s Count', StudiouWC_Main::get_text_domain()), esc_html($name)); 
+                        ?></th>
                     <?php endforeach; ?>
                     <th><a href="<?php echo esc_url(add_query_arg(array('orderby' => 'total_price', 'order' => $order === 'ASC' ? 'DESC' : 'ASC'))); ?>"><?php _e('Total Price', StudiouWC_Main::get_text_domain()); ?></a></th>
                 </tr>
@@ -271,6 +280,7 @@ class StudiouWC_Admin_View {
             <h1><?php _e('Custom Report Settings', StudiouWC_Main::get_text_domain()); ?></h1>
             
             <form method="post" id="studiou-settings-form">
+                <?php wp_nonce_field('studiou_save_settings', 'studiou_settings_nonce'); ?>
                 <table class="form-table">
                     <tr>
                         <th><label for="default_interval"><?php _e('Default shown interval', StudiouWC_Main::get_text_domain()); ?></label></th>
@@ -326,10 +336,12 @@ class StudiouWC_Admin_View {
                 
                 $.post(ajaxurl, formData, function(response) {
                     if (response.success) {
-                        alert('<?php _e('Settings saved successfully!', StudiouWC_Main::get_text_domain()); ?>');
+                        alert('<?php echo esc_js(__('Settings saved successfully!', StudiouWC_Main::get_text_domain())); ?>');
                     } else {
-                        alert('<?php _e('Error saving settings.', StudiouWC_Main::get_text_domain()); ?>');
+                        alert('<?php echo esc_js(__('Error saving settings.', StudiouWC_Main::get_text_domain())); ?>');
                     }
+                }).fail(function() {
+                    alert('<?php echo esc_js(__('Connection error. Please try again.', StudiouWC_Main::get_text_domain())); ?>');
                 });
             });
         });

+ 14 - 4
studiou-wc-custom-reports/includes/class-export-handler.php

@@ -44,13 +44,21 @@ class StudiouWC_Export_Handler {
     
     private function generate_csv_output($report_data, $property_values) {
         // Set headers for CSV download
-        header('Content-Type: text/csv');
-        header('Content-Disposition: attachment; filename="custom-reports-' . date('Y-m-d') . '.csv"');
+        header('Content-Type: text/csv; charset=utf-8');
+        $filename = sprintf(
+            /* translators: %s: current date */
+            __('custom-reports-%s.csv', StudiouWC_Main::get_text_domain()),
+            date('Y-m-d')
+        );
+        header('Content-Disposition: attachment; filename="' . $filename . '"');
         header('Pragma: no-cache');
         header('Expires: 0');
         
         $output = fopen('php://output', 'w');
         
+        // Add UTF-8 BOM for Excel compatibility
+        fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));
+        
         // CSV headers
         $headers = $this->get_csv_headers($property_values);
         fputcsv($output, $headers);
@@ -72,7 +80,8 @@ class StudiouWC_Export_Handler {
         );
         
         foreach ($property_values as $slug => $name) {
-            $headers[] = $name . ' Count';
+            /* translators: %s: property name */
+            $headers[] = sprintf(__('%s Count', StudiouWC_Main::get_text_domain()), $name);
         }
         
         $headers[] = __('Total Price', StudiouWC_Main::get_text_domain());
@@ -90,7 +99,8 @@ class StudiouWC_Export_Handler {
             $csv_row[] = $row['property_counts'][$slug] ?? 0;
         }
         
-        $csv_row[] = $row['total_price'];
+        // Format price without HTML for CSV
+        $csv_row[] = strip_tags(wc_price($row['total_price']));
         
         return $csv_row;
     }

+ 10 - 5
studiou-wc-custom-reports/includes/class-main.php

@@ -40,15 +40,20 @@ class StudiouWC_Main {
     }
     
     public function init() {
-        load_plugin_textdomain(
-            STUDIOU_WC_CUSTOM_REPORTS_TEXT_DOMAIN, 
-            false, 
-            dirname(plugin_basename(STUDIOU_WC_CUSTOM_REPORTS_PLUGIN_FILE)) . '/languages'
-        );
+        // Load text domain - this is now handled in the main plugin file
+        // but keeping this for backward compatibility
+        if (!did_action('plugins_loaded')) {
+            load_plugin_textdomain(
+                STUDIOU_WC_CUSTOM_REPORTS_TEXT_DOMAIN, 
+                false, 
+                dirname(plugin_basename(STUDIOU_WC_CUSTOM_REPORTS_PLUGIN_FILE)) . '/languages'
+            );
+        }
     }
     
     public function deactivate() {
         // Cleanup if needed
+        // Note: We don't delete settings on deactivation, only on uninstall
     }
     
     public static function get_text_domain() {

+ 2 - 1
studiou-wc-custom-reports/includes/class-report-factory.php

@@ -22,7 +22,8 @@ class StudiouWC_Report_Factory {
             case 'product_categories_summary':
                 return new StudiouWC_Product_Categories_Report($this->db_manager, $data);
             default:
-                throw new InvalidArgumentException("Unknown report type: $type");
+                /* translators: %s: report type name */
+                throw new InvalidArgumentException(sprintf(__('Unknown report type: %s', StudiouWC_Main::get_text_domain()), $type));
         }
     }
     

+ 15 - 2
studiou-wc-custom-reports/includes/class-settings-manager.php

@@ -55,6 +55,11 @@ class StudiouWC_Settings_Manager {
     }
     
     public function save_settings() {
+        // Verify nonce for security
+        if (!isset($_POST['studiou_settings_nonce']) || !wp_verify_nonce($_POST['studiou_settings_nonce'], 'studiou_save_settings')) {
+            wp_send_json_error(__('Security check failed.', StudiouWC_Main::get_text_domain()));
+        }
+        
         if (!current_user_can('manage_woocommerce')) {
             wp_send_json_error(__('You do not have sufficient permissions.', StudiouWC_Main::get_text_domain()));
         }
@@ -65,8 +70,16 @@ class StudiouWC_Settings_Manager {
             'default_statuses' => isset($_POST['default_statuses']) ? array_map('sanitize_text_field', $_POST['default_statuses']) : array()
         );
         
-        $this->update_settings($settings);
+        // Validate interval
+        $valid_intervals = array('last_day', 'last_week', 'last_month');
+        if (!in_array($settings['default_interval'], $valid_intervals)) {
+            $settings['default_interval'] = 'last_month';
+        }
         
-        wp_send_json_success(__('Settings saved successfully!', StudiouWC_Main::get_text_domain()));
+        if ($this->update_settings($settings)) {
+            wp_send_json_success(__('Settings saved successfully!', StudiouWC_Main::get_text_domain()));
+        } else {
+            wp_send_json_error(__('Error saving settings.', StudiouWC_Main::get_text_domain()));
+        }
     }
 }

BIN=BIN
studiou-wc-custom-reports/languages/studiou-wc-custom-reports-cs_CZ.mo


+ 383 - 0
studiou-wc-custom-reports/languages/studiou-wc-custom-reports-cs_CZ.po

@@ -0,0 +1,383 @@
+# Czech (Czech Republic) translation for QDR - Studiou WC Custom Reports
+# Copyright (C) 2025 Dalibor Votruba
+# This file is distributed under the same license as the QDR - Studiou WC Custom Reports package.
+# Dalibor Votruba <email@quadarax.com>, 2025.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: QDR - Studiou WC Custom Reports 1.0.0\n"
+"Report-Msgid-Bugs-To: https://www.quadarax.com\n"
+"POT-Creation-Date: 2025-06-16 09:42:33+0000\n"
+"PO-Revision-Date: 2025-06-16 09:42:33+0000\n"
+"Last-Translator: Dalibor Votruba <email@quadarax.com>\n"
+"Language-Team: Czech\n"
+"Language: cs_CZ\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: WordPress\n"
+"X-Domain: studiou-wc-custom-reports\n"
+
+#: studiou-wc-custom-reports.php
+msgid "Studiou WC Custom Reports requires WooCommerce to be installed and active."
+msgstr "Studiou WC Custom Reports vyžaduje nainstalovaný a aktivní WooCommerce."
+
+#: includes/class-admin-view.php
+msgid "Custom Reports"
+msgstr "Vlastní reporty"
+
+#: includes/class-admin-view.php
+msgid "Custom Report Settings"
+msgstr "Nastavení vlastních reportů"
+
+#: includes/class-admin-view.php
+msgid "View"
+msgstr "Zobrazení"
+
+#: includes/class-admin-view.php
+msgid "Product Categories and Variants Summary"
+msgstr "Souhrn kategorií produktů a variant"
+
+#: includes/class-admin-view.php
+msgid "Date From"
+msgstr "Datum od"
+
+#: includes/class-admin-view.php
+msgid "Date To"
+msgstr "Datum do"
+
+#: includes/class-admin-view.php
+msgid "Included Statuses"
+msgstr "Zahrnuté stavy"
+
+#: includes/class-admin-view.php
+msgid "Items per page"
+msgstr "Položek na stránku"
+
+#: includes/class-admin-view.php
+msgid "Filter"
+msgstr "Filtrovat"
+
+#: includes/class-admin-view.php
+msgid "Export"
+msgstr "Exportovat"
+
+#: includes/class-admin-view.php
+msgid "No data found for the selected criteria."
+msgstr "Pro vybraná kritéria nebyla nalezena žádná data."
+
+#: includes/class-admin-view.php
+msgid "%d items"
+msgstr "%d položek"
+
+#: includes/class-admin-view.php
+msgid "‹"
+msgstr "‹"
+
+#: includes/class-admin-view.php
+msgid "›"
+msgstr "›"
+
+#: includes/class-admin-view.php
+msgid "%1$d of %2$d"
+msgstr "%1$d z %2$d"
+
+#: includes/class-admin-view.php
+msgid "Product Category"
+msgstr "Kategorie produktu"
+
+#: includes/class-admin-view.php
+msgid "Orders Count"
+msgstr "Počet objednávek"
+
+#: includes/class-admin-view.php
+msgid "Total Price"
+msgstr "Celková cena"
+
+#: includes/class-admin-view.php
+msgid "Default shown interval"
+msgstr "Výchozí zobrazený interval"
+
+#: includes/class-admin-view.php
+msgid "Last day"
+msgstr "Poslední den"
+
+#: includes/class-admin-view.php
+msgid "Last week"
+msgstr "Poslední týden"
+
+#: includes/class-admin-view.php
+msgid "Last month"
+msgstr "Poslední měsíc"
+
+#: includes/class-admin-view.php
+msgid "Default property"
+msgstr "Výchozí vlastnost"
+
+#: includes/class-admin-view.php
+msgid "Select property"
+msgstr "Vyberte vlastnost"
+
+#: includes/class-admin-view.php
+msgid "Default Included statuses"
+msgstr "Výchozí zahrnuté stavy"
+
+#: includes/class-admin-view.php
+msgid "Save Settings"
+msgstr "Uložit nastavení"
+
+#: includes/class-admin-view.php
+msgid "Settings saved successfully!"
+msgstr "Nastavení bylo úspěšně uloženo!"
+
+#: includes/class-admin-view.php
+msgid "Error saving settings."
+msgstr "Chyba při ukládání nastavení."
+
+#: includes/class-export-handler.php
+msgid "You do not have sufficient permissions to access this page."
+msgstr "Nemáte dostatečná oprávnění pro přístup k této stránce."
+
+#: includes/class-report-factory.php
+msgid "Product Categories and Variants Summary"
+msgstr "Souhrn kategorií produktů a variant"
+
+#: includes/class-settings-manager.php
+msgid "Security check failed."
+msgstr "Kontrola zabezpečení selhala."
+
+#: includes/class-settings-manager.php
+msgid "You do not have sufficient permissions."
+msgstr "Nemáte dostatečná oprávnění."
+
+#: includes/class-settings-manager.php
+msgid "Settings saved successfully!"
+msgstr "Nastavení bylo úspěšně uloženo!"
+
+#: includes/class-settings-manager.php
+msgid "Error saving settings."
+msgstr "Chyba při ukládání nastavení."
+
+#: includes/class-admin-view.php
+msgid "Connection error. Please try again."
+msgstr "Chyba připojení. Zkuste to prosím znovu."
+
+#: includes/class-admin-view.php
+msgid "%s Count"
+msgstr "Počet %s"
+
+#: includes/class-admin-view.php
+msgid "%d item"
+msgid_plural "%d items"
+msgstr[0] "%d položka"
+msgstr[1] "%d položky"
+msgstr[2] "%d položek"
+
+#: includes/class-admin-view.php
+msgid "Previous"
+msgstr "Předchozí"
+
+#: includes/class-admin-view.php
+msgid "Next"
+msgstr "Další"
+
+#: includes/class-export-handler.php
+msgid "custom-reports-%s.csv"
+msgstr "vlastni-reporty-%s.csv"
+
+#: includes/class-report-factory.php
+msgid "Unknown report type: %s"
+msgstr "Neznámý typ reportu: %s"
+
+# Plugin description from header
+msgid "Allows view WooCommerce/Reports that shows custom overviews according to order, product, product categories, properties"
+msgstr "Umožňuje zobrazení WooCommerce/Reportů, které ukazují vlastní přehledy podle objednávek, produktů, kategorií produktů a vlastností"
+
+# Additional common WooCommerce terms that might be used
+msgid "Processing"
+msgstr "Zpracovává se"
+
+msgid "Completed"
+msgstr "Dokončeno"
+
+msgid "On hold"
+msgstr "Pozastaveno"
+
+msgid "Pending"
+msgstr "Čeká na vyřízení"
+
+msgid "Cancelled"
+msgstr "Zrušeno"
+
+msgid "Refunded"
+msgstr "Vráceno"
+
+msgid "Failed"
+msgstr "Neúspěšné"
+
+# Export related terms
+msgid "CSV Export"
+msgstr "Export CSV"
+
+msgid "Download"
+msgstr "Stáhnout"
+
+# Pagination
+msgid "First"
+msgstr "První"
+
+msgid "Last"
+msgstr "Poslední"
+
+msgid "Previous"
+msgstr "Předchozí"
+
+msgid "Next"
+msgstr "Další"
+
+# Error messages
+msgid "Invalid date format"
+msgstr "Neplatný formát data"
+
+msgid "No results found"
+msgstr "Nebyly nalezeny žádné výsledky"
+
+msgid "Loading..."
+msgstr "Načítá se..."
+
+# Success messages
+msgid "Data exported successfully"
+msgstr "Data byla úspěšně exportována"
+
+msgid "Report generated successfully"
+msgstr "Report byl úspěšně vygenerován"
+
+# Filters and sorting
+msgid "Sort by"
+msgstr "Seřadit podle"
+
+msgid "Ascending"
+msgstr "Vzestupně"
+
+msgid "Descending"
+msgstr "Sestupně"
+
+msgid "Apply Filter"
+msgstr "Použít filtr"
+
+msgid "Clear Filter"
+msgstr "Vymazat filtr"
+
+# Product related terms
+msgid "Product"
+msgstr "Produkt"
+
+msgid "Products"
+msgstr "Produkty"
+
+msgid "Variant"
+msgstr "Varianta"
+
+msgid "Variants"
+msgstr "Varianty"
+
+msgid "Category"
+msgstr "Kategorie"
+
+msgid "Categories"
+msgstr "Kategorie"
+
+msgid "Price"
+msgstr "Cena"
+
+msgid "Order"
+msgstr "Objednávka"
+
+msgid "Orders"
+msgstr "Objednávky"
+
+msgid "Revenue"
+msgstr "Tržby"
+
+msgid "Count"
+msgstr "Počet"
+
+msgid "Total"
+msgstr "Celkem"
+
+msgid "Average"
+msgstr "Průměr"
+
+# Time periods
+msgid "Today"
+msgstr "Dnes"
+
+msgid "Yesterday"
+msgstr "Včera"
+
+msgid "This week"
+msgstr "Tento týden"
+
+msgid "This month"
+msgstr "Tento měsíc"
+
+msgid "This year"
+msgstr "Tento rok"
+
+msgid "Custom range"
+msgstr "Vlastní rozsah"
+
+# Status messages
+msgid "All statuses"
+msgstr "Všechny stavy"
+
+msgid "Select all"
+msgstr "Vybrat vše"
+
+msgid "Deselect all"
+msgstr "Zrušit výběr všech"
+
+# Units and formatting
+msgid "Kč"
+msgstr "Kč"
+
+msgid "pcs"
+msgstr "ks"
+
+msgid "piece"
+msgstr "kus"
+
+msgid "pieces"
+msgstr "kusů"
+
+# General UI terms
+msgid "Settings"
+msgstr "Nastavení"
+
+msgid "Reports"
+msgstr "Reporty"
+
+msgid "Dashboard"
+msgstr "Nástěnka"
+
+msgid "Administration"
+msgstr "Správa"
+
+msgid "Search"
+msgstr "Hledat"
+
+msgid "Reset"
+msgstr "Resetovat"
+
+msgid "Refresh"
+msgstr "Obnovit"
+
+msgid "Print"
+msgstr "Tisknout"
+
+msgid "Help"
+msgstr "Nápověda"
+
+msgid "Documentation"
+msgstr "Dokumentace"

+ 18 - 1
studiou-wc-custom-reports/studiou-wc-custom-reports.php

@@ -61,6 +61,23 @@ require_once STUDIOU_WC_CUSTOM_REPORTS_PLUGIN_DIR . 'includes/class-main.php';
 
 // Initialize the plugin
 function studiou_wc_custom_reports_init() {
+    // Load translations
+    load_plugin_textdomain(
+        STUDIOU_WC_CUSTOM_REPORTS_TEXT_DOMAIN,
+        false,
+        dirname(plugin_basename(__FILE__)) . '/languages/'
+    );
+    
+    // Initialize main plugin class
     new StudiouWC_Main();
 }
-add_action('plugins_loaded', 'studiou_wc_custom_reports_init');
+add_action('plugins_loaded', 'studiou_wc_custom_reports_init');
+
+// Load textdomain for admin notices (before plugins_loaded)
+add_action('init', function() {
+    load_plugin_textdomain(
+        STUDIOU_WC_CUSTOM_REPORTS_TEXT_DOMAIN,
+        false,
+        dirname(plugin_basename(__FILE__)) . '/languages/'
+    );
+});