From 7802dcd5e114b49946e62fa2309283090c09acd0 Mon Sep 17 00:00:00 2001 From: Maciej Pienczyn Date: Mon, 9 Feb 2026 09:44:59 +0100 Subject: [PATCH] fix(i18n): Fix Polish diacritics in audit templates and scraper encoding - Fix ~190 hardcoded Polish strings missing diacritical characters across seo_audit.html, gbp_audit.html, social_audit.html - Fix encoding issue in SEO scraper: requests defaults to ISO-8859-1 when server omits charset, causing mojibake for UTF-8 pages. Now uses apparent_encoding detection. Co-Authored-By: Claude Opus 4.6 --- scripts/seo_audit.py | 5 + templates/gbp_audit.html | 180 ++++++++++++++-------------- templates/seo_audit.html | 226 ++++++++++++++++++------------------ templates/social_audit.html | 114 +++++++++--------- 4 files changed, 265 insertions(+), 260 deletions(-) diff --git a/scripts/seo_audit.py b/scripts/seo_audit.py index 3f98906..b208bb3 100644 --- a/scripts/seo_audit.py +++ b/scripts/seo_audit.py @@ -591,6 +591,9 @@ class SEOAuditor: final_url = response.url if response.status_code == 200: + # Fix encoding: requests defaults to ISO-8859-1 when charset missing + if response.encoding and response.encoding.lower() == 'iso-8859-1': + response.encoding = response.apparent_encoding html_content = response.text logger.info(f" Page fetched successfully ({load_time_ms}ms)") else: @@ -607,6 +610,8 @@ class SEOAuditor: http_status = response.status_code final_url = response.url if response.status_code == 200: + if response.encoding and response.encoding.lower() == 'iso-8859-1': + response.encoding = response.apparent_encoding html_content = response.text except Exception as e2: result['errors'].append(f'HTTP fallback failed: {str(e2)[:50]}') diff --git a/templates/gbp_audit.html b/templates/gbp_audit.html index 2abfcf7..842ae0c 100644 --- a/templates/gbp_audit.html +++ b/templates/gbp_audit.html @@ -913,7 +913,7 @@ - Analiza kompletnosci wizytowki Google dla lokalnego SEO + Analiza kompletności wizytówki Google dla lokalnego SEO
@@ -929,7 +929,7 @@ - Zobacz wizytowke Google + Zobacz wizytówkę Google {% endif %} {% if places_data and places_data.maps_links %} @@ -938,7 +938,7 @@ - Popros o opinie + Poproś o opinię {% endif %} {% if places_data.maps_links.directionsUri %} @@ -946,7 +946,7 @@ - Pokaz trase + Pokaż trasę {% endif %} {% endif %} @@ -974,32 +974,32 @@ {% if places_data and places_data.open_now is not none %}
- {% if places_data.open_now %}Otwarte{% else %}Zamkniete{% endif %} + {% if places_data.open_now %}Otwarte{% else %}Zamknięte{% endif %} (na moment audytu)
{% endif %}
{% if score >= 90 %} - Doskonaly profil GBP + Doskonały profil GBP {% elif score >= 70 %} Dobry profil GBP {% elif score >= 50 %} - Przecietny profil GBP + Przeciętny profil GBP {% elif score >= 30 %} - Profil wymaga uzupelnienia + Profil wymaga uzupełnienia {% else %} - Slaby profil GBP + Słaby profil GBP {% endif %}

{% if audit.completeness_score >= 90 %} - Twoja wizytowka Google jest bardzo dobrze zoptymalizowana. Utrzymaj wysoki standard i monitoruj opinie klientow. + Twoja wizytówka Google jest bardzo dobrze zoptymalizowana. Utrzymaj wysoki standard i monitoruj opinie klientów. {% elif audit.completeness_score >= 70 %} - Profil jest w dobrym stanie, ale sa obszary do poprawy. Skupienie sie na rekomendacjach zwiekszy widocznosc. + Profil jest w dobrym stanie, ale są obszary do poprawy. Skupienie się na rekomendacjach zwiększy widoczność. {% elif audit.completeness_score >= 50 %} - Wizytowka wymaga uzupelnienia. Wdrozenie ponizszych rekomendacji znaczaco poprawi lokalne SEO. + Wizytówka wymaga uzupełnienia. Wdrożenie poniższych rekomendacji znacząco poprawi lokalne SEO. {% else %} - Wizytowka jest niekompletna i traci potencjalnych klientow. Priorytetowo uzupelnij brakujace informacje. + Wizytówka jest niekompletna i traci potencjalnych klientów. Priorytetowo uzupełnij brakujące informacje. {% endif %}

@@ -1046,7 +1046,7 @@
Poziom cen: - {% if places_data.price_level == 'PRICE_LEVEL_FREE' %}Bezplatne + {% if places_data.price_level == 'PRICE_LEVEL_FREE' %}Bezpłatne {% elif places_data.price_level == 'PRICE_LEVEL_INEXPENSIVE' %}$ Niedrogi {% elif places_data.price_level == 'PRICE_LEVEL_MODERATE' %}$$ Umiarkowany {% elif places_data.price_level == 'PRICE_LEVEL_EXPENSIVE' %}$$$ Drogi @@ -1066,9 +1066,9 @@ - Porownanie NAP (Name, Address, Phone) + Porównanie NAP (Name, Address, Phone) -

Spojnosc danych NAP wplywa na lokalne SEO. Roznice moga obnizac widocznosc w Google.

+

Spójność danych NAP wpływa na lokalne SEO. Różnice mogą obniżać widoczność w Google.

@@ -1129,7 +1129,7 @@ - Status pol wizytowki + Status pól wizytówki
@@ -1139,11 +1139,11 @@
- Czesciowe + Częściowe
- Brakujace + Brakujące
@@ -1167,14 +1167,14 @@ 'website': 'Strona WWW', 'hours': 'Godziny otwarcia', 'categories': 'Kategorie', - 'photos': 'Zdjecia', + 'photos': 'Zdjęcia', 'description': 'Opis', - 'services': 'Uslugi', + 'services': 'Usługi', 'reviews': 'Opinie' } %} {% set status_names = { 'complete': 'Kompletne', - 'partial': 'Czesciowe', + 'partial': 'Częściowe', 'missing': 'Brakuje' } %} @@ -1212,11 +1212,11 @@ {% if field_name == 'reviews' %}
{% if field_data.score == field_data.max_score %} - 🏆 Doskonale! Masz maksymalna punktacje za opinie + 🏆 Doskonale! Masz maksymalną punktację za opinie {% elif field_data.score == 0 %} - 💡 Popros zadowolonych klientow o opinie w Google + 💡 Poproś zadowolonych klientów o opinie w Google {% else %} - 👍 Dobry poczatek! Zbierz wiecej opinii - cel to minimum 5 + 👍 Dobry początek! Zbierz więcej opinii - cel to minimum 5 {% endif %} {% if field_data.details and field_data.details.breakdown %}
{{ field_data.details.breakdown }}
@@ -1254,7 +1254,7 @@
- {{ audit.reviews_with_response or 0 }} z {{ (audit.reviews_with_response or 0) + (audit.reviews_without_response or 0) }} opinii z odpowiedzia + {{ audit.reviews_with_response or 0 }} z {{ (audit.reviews_with_response or 0) + (audit.reviews_without_response or 0) }} opinii z odpowiedzią
@@ -1297,7 +1297,7 @@ {% if audit.review_keywords %}
- Slowa kluczowe z opinii + Słowa kluczowe z opinii
{% for keyword in audit.review_keywords[:8] %} @@ -1342,7 +1342,7 @@ {% endif %} {% if review.has_owner_response and review.owner_response_text %}
-
Odpowiedz wlasciciela:
+
Odpowiedź właściciela:

{{ review.owner_response_text[:200] }}{% if review.owner_response_text|length > 200 %}...{% endif %}

{% endif %} @@ -1370,7 +1370,7 @@ - Sredni czas odpowiedzi + Średni czas odpowiedzi {{ '%.1f'|format(resp_days) }} dni @@ -1378,11 +1378,11 @@
{% if resp_days <= 2 %} - Doskonaly czas reakcji na opinie klientow + Doskonały czas reakcji na opinie klientów {% elif resp_days <= 7 %} - Dobry czas reakcji — postaraj sie odpowiadac w ciagu 1-2 dni + Dobry czas reakcji — postaraj się odpowiadać w ciągu 1-2 dni {% else %} - Dlugi czas odpowiedzi — klienci oczekuja szybszej reakcji + Długi czas odpowiedzi — klienci oczekują szybszej reakcji {% endif %}
@@ -1395,7 +1395,7 @@ - Slowa kluczowe w opisie + Słowa kluczowe w opisie
@@ -1406,7 +1406,7 @@ {% if audit.keyword_density_score is not none %}
- Gestosc slow kluczowych + Gęstość słów kluczowych {{ audit.keyword_density_score }}/10
@@ -1427,15 +1427,15 @@ - Spojnosc NAP (Nazwa / Adres / Telefon) + Spójność NAP (Nazwa / Adres / Telefon) {% if audit.nap_consistent %}
- Dane NAP na wizytowce Google sa spojne z danymi na stronie WWW firmy. + Dane NAP na wizytówce Google są spójne z danymi na stronie WWW firmy.
{% else %}
- Wykryto roznice miedzy wizytowka Google a strona WWW firmy. + Wykryto różnice między wizytówką Google a stroną WWW firmy.
{% if audit.nap_issues %}
@@ -1443,7 +1443,7 @@
{{ issue.field|capitalize }} - Rozbieznosc + Rozbieżność
Google: {{ issue.gbp or 'Brak' }}
@@ -1464,7 +1464,7 @@ - Aktywnosc i atrybuty + Aktywność i atrybuty
{% if audit.has_posts is not none %} @@ -1474,7 +1474,7 @@ {{ 'Aktywne' if audit.has_posts else 'Brak' }}
{% if audit.posts_count_30d %} -
{{ audit.posts_count_30d }} postow w ostatnich 30 dniach
+
{{ audit.posts_count_30d }} postów w ostatnich 30 dniach
{% endif %}
{% endif %} @@ -1506,7 +1506,7 @@ {% if audit.special_hours %}
{% for entry in audit.special_hours %} -
{{ entry.get('date', '') }}: {% if entry.get('closed') %}Zamkniete{% else %}{{ entry.get('open', '') }} - {{ entry.get('close', '') }}{% endif %}
+
{{ entry.get('date', '') }}: {% if entry.get('closed') %}Zamknięte{% else %}{{ entry.get('open', '') }} - {{ entry.get('close', '') }}{% endif %}
{% endfor %}
{% endif %} @@ -1525,14 +1525,14 @@ {% if audit.cover_photo_present is not none %}
{{ '✓' if audit.cover_photo_present else '✗' }} - Zdjecie w tle + Zdjęcie w tle
{% endif %}
{% endif %} {% if audit.photo_categories %} -

Kategorie zdjec

+

Kategorie zdjęć

{% for category, count in audit.photo_categories.items() %} @@ -1611,7 +1611,7 @@ -

Jak dziala wizytowka Google?

+

Jak działa wizytówka Google?

@@ -1622,12 +1622,12 @@

Wyszukiwarka Google

-

Gdy ktos szuka Twojej firmy w Google, po prawej stronie wynikow pojawia sie Panel Wiedzy (Knowledge Panel).

+

Gdy ktoś szuka Twojej firmy w Google, po prawej stronie wyników pojawia się Panel Wiedzy (Knowledge Panel).

  • Nazwa i logo firmy
  • Adres i godziny otwarcia
  • Ocena i opinie
  • -
  • Przycisk "Zadzwon" i "Trasa"
  • +
  • Przycisk "Zadzwoń" i "Trasa"
@@ -1639,12 +1639,12 @@

Mapy Google

-

W aplikacji Google Maps Twoja firma ma pelna wizytowke z dodatkowymi funkcjami.

+

W aplikacji Google Maps Twoja firma ma pełną wizytówkę z dodatkowymi funkcjami.

    -
  • Zdjecia i wirtualny spacer
  • -
  • Wszystkie opinie klientow
  • +
  • Zdjęcia i wirtualny spacer
  • +
  • Wszystkie opinie klientów
  • Pytania i odpowiedzi (Q&A)
  • -
  • Posty i aktualnosci firmy
  • +
  • Posty i aktualności firmy
@@ -1655,13 +1655,13 @@
-

Jak zarzadzac?

-

Wszystkie dane edytujesz w jednym miejscu - panelu Google Business Profile.

+

Jak zarządzać?

+

Wszystkie dane edytujesz w jednym miejscu — panelu Google Business Profile.

  • Wejdz na business.google.com
  • -
  • Zaloguj sie kontem Google
  • -
  • Edytuj dane - zaktualizuja sie wszedzie
  • -
  • Odpowiadaj na opinie klientow
  • +
  • Zaloguj się kontem Google
  • +
  • Edytuj dane — zaktualizują się wszędzie
  • +
  • Odpowiadaj na opinie klientów
@@ -1671,10 +1671,10 @@

- Jedno zrodlo, wiele widokow. - Panel Wiedzy w wyszukiwarce i wizytowka w Mapach Google to te same dane wyswietlane w roznych miejscach. - Wystarczy, ze zarzadzasz profilem w Google Business Profile - - zmiany automatycznie pojawia sie wszedzie: w wyszukiwarce, Mapach, Asystencie Google i wynikach lokalnych. + Jedno źródło, wiele widoków. + Panel Wiedzy w wyszukiwarce i wizytówka w Mapach Google to te same dane wyświetlane w różnych miejscach. + Wystarczy, że zarządzasz profilem w Google Business Profile — + zmiany automatycznie pojawią się wszędzie: w wyszukiwarce, Mapach, Asystencie Google i wynikach lokalnych.

@@ -1698,7 +1698,7 @@

Brak danych audytu

-

Nie przeprowadzono jeszcze audytu wizytowki Google dla tej firmy. Uruchom audyt, aby sprawdzic kompletnosc profilu.

+

Nie przeprowadzono jeszcze audytu wizytówki Google dla tej firmy. Uruchom audyt, aby sprawdzić kompletność profilu.

{% if can_audit %} @@ -1844,7 +1844,7 @@ const allSteps = [ const detailLabels = { 'step-rating': 'Ocena Google', 'step-reviews': 'Liczba opinii Google', - 'step-photos': 'Zdjecia Google', + 'step-photos': 'Zdjęcia Google', 'step-hours': 'Godziny otwarcia Google', 'step-phone': 'Numer telefonu Google', 'step-website': 'Strona WWW Google', @@ -1933,7 +1933,7 @@ async function updateDetailSteps(googleData) { const delay = 150; // ms between each step animation // Rating - updateStep('step-rating', 'in_progress', 'Pobieram ocene...'); + updateStep('step-rating', 'in_progress', 'Pobieram ocenę...'); await new Promise(r => setTimeout(r, delay)); if (googleData.google_rating) { updateStep('step-rating', 'complete', `Ocena: ${googleData.google_rating}/5`); @@ -1951,12 +1951,12 @@ async function updateDetailSteps(googleData) { } // Photos - updateStep('step-photos', 'in_progress', 'Pobieram zdjecia...'); + updateStep('step-photos', 'in_progress', 'Pobieram zdjęcia...'); await new Promise(r => setTimeout(r, delay)); if (googleData.google_photos_count) { - updateStep('step-photos', 'complete', `Zdjecia: ${googleData.google_photos_count}`); + updateStep('step-photos', 'complete', `Zdjęcia: ${googleData.google_photos_count}`); } else { - updateStep('step-photos', 'missing', 'Brak zdjec'); + updateStep('step-photos', 'missing', 'Brak zdjęć'); } // Opening hours @@ -1978,7 +1978,7 @@ async function updateDetailSteps(googleData) { } // Website - updateStep('step-website', 'in_progress', 'Pobieram strone WWW...'); + updateStep('step-website', 'in_progress', 'Pobieram stronę WWW...'); await new Promise(r => setTimeout(r, delay)); if (googleData.google_website) { // Truncate long URLs @@ -1994,8 +1994,8 @@ async function updateDetailSteps(googleData) { if (googleData.google_business_status) { const statusMap = { 'OPERATIONAL': 'Czynna', - 'CLOSED_TEMPORARILY': 'Tymczasowo zamknieta', - 'CLOSED_PERMANENTLY': 'Zamknieta na stale' + 'CLOSED_TEMPORARILY': 'Tymczasowo zamknięta', + 'CLOSED_PERMANENTLY': 'Zamknięta na stałe' }; const statusText = statusMap[googleData.google_business_status] || googleData.google_business_status; updateStep('step-status', 'complete', `Status: ${statusText}`); @@ -2047,30 +2047,30 @@ async function runAudit() { // Mark detail steps as skipped if no Google data const detailStepIds = ['step-rating', 'step-reviews', 'step-photos', 'step-hours', 'step-phone', 'step-website', 'step-status']; for (const stepId of detailStepIds) { - updateStep(stepId, 'skipped', detailLabels[stepId] + ' (pominiety)'); + updateStep(stepId, 'skipped', detailLabels[stepId] + ' (pominięty)'); } } // Update audit step if (response.ok && data.success) { updateStep('step-save', 'complete', 'Dane zapisane'); - updateStep('step-audit', 'complete', `Analiza zakonczona: ${data.audit?.total_score || 0}/100`); + updateStep('step-audit', 'complete', `Analiza zakończona: ${data.audit?.total_score || 0}/100`); // Wait 5 seconds so user can read the progress steps await new Promise(r => setTimeout(r, 5000)); hideLoading(); - showInfoModal('Audyt zakonczony', 'Audyt wizytowki Google zostal zakonczony pomyslnie. Strona zostanie odswiezona.', true); + showInfoModal('Audyt zakończony', 'Audyt wizytówki Google został zakończony pomyślnie. Strona zostanie odświeżona.', true); setTimeout(() => location.reload(), 1500); } else { - updateStep('step-audit', 'error', 'Blad audytu'); + updateStep('step-audit', 'error', 'Błąd audytu'); // Wait 5 seconds so user can see what failed await new Promise(r => setTimeout(r, 5000)); hideLoading(); - showInfoModal('Blad', data.error || 'Wystapil nieznany blad podczas audytu.', false); + showInfoModal('Błąd', data.error || 'Wystąpił nieznany błąd podczas audytu.', false); if (btn) btn.disabled = false; } } catch (error) { hideLoading(); - showInfoModal('Blad polaczenia', 'Nie udalo sie polaczyc z serwerem: ' + error.message, false); + showInfoModal('Błąd połączenia', 'Nie udało się połączyć z serwerem: ' + error.message, false); if (btn) btn.disabled = false; } } @@ -2137,9 +2137,9 @@ async function runAIAnalysis(force) { const results = document.getElementById('aiResults'); results.innerHTML = `
-

Blad analizy AI

-

${escapeHtml(data.error || 'Nieznany blad')}

- +

Błąd analizy AI

+

${escapeHtml(data.error || 'Nieznany błąd')}

+
`; results.style.display = 'block'; } @@ -2151,9 +2151,9 @@ async function runAIAnalysis(force) { const results = document.getElementById('aiResults'); results.innerHTML = `
-

Blad polaczenia

+

Błąd połączenia

${escapeHtml(error.message)}

- +
`; results.style.display = 'block'; } @@ -2177,7 +2177,7 @@ function renderAIResults(data) { actionsList.innerHTML = ''; const actions = data.actions || []; - const priorityLabels = {critical: 'KRYTYCZNE', high: 'WYSOKI', medium: 'SREDNI', low: 'NISKI'}; + const priorityLabels = {critical: 'KRYTYCZNE', high: 'WYSOKI', medium: 'ŚREDNI', low: 'NISKI'}; actions.forEach((action, idx) => { const impact = action.impact_score || 5; @@ -2188,25 +2188,25 @@ function renderAIResults(data) { card.innerHTML = `
- ${priorityLabels[action.priority] || 'SREDNI'} + ${priorityLabels[action.priority] || 'ŚREDNI'} ${escapeHtml(action.title || '')}

${escapeHtml(action.description || '')}

-
Wplyw: ${impact}/10
+
Wpływ: ${impact}/10
-
Wysilek: ${effort}/10
+
Wysiłek: ${effort}/10
`; } diff --git a/templates/seo_audit.html b/templates/seo_audit.html index e96bc63..59bc0ef 100644 --- a/templates/seo_audit.html +++ b/templates/seo_audit.html @@ -611,7 +611,7 @@ - Analiza SEO i wydajnosci strony WWW (Google PageSpeed Insights) + Analiza SEO i wydajności strony WWW (Google PageSpeed Insights) {% if company.website %}
@@ -652,31 +652,31 @@
{% if score >= 90 %} - Doskonaly wynik SEO (Google Lighthouse) + Doskonały wynik SEO (Google Lighthouse) {% elif score >= 70 %} Dobry wynik SEO (Google Lighthouse) {% elif score >= 50 %} - Przecietny wynik SEO (Google Lighthouse) + Przeciętny wynik SEO (Google Lighthouse) {% elif score >= 30 %} Wynik SEO wymaga poprawy (Google Lighthouse) {% else %} - Slaby wynik SEO (Google Lighthouse) + Słaby wynik SEO (Google Lighthouse) {% endif %}

{% if score >= 90 %} - Strona jest bardzo dobrze zoptymalizowana pod katem SEO. Utrzymuj wysoki standard i monitoruj zmiany. + Strona jest bardzo dobrze zoptymalizowana pod kątem SEO. Utrzymuj wysoki standard i monitoruj zmiany. {% elif score >= 70 %} - Strona ma dobra optymalizacje SEO, ale sa obszary do poprawy. Skup sie na wydajnosci i dostepnosci. + Strona ma dobrą optymalizację SEO, ale są obszary do poprawy. Skup się na wydajności i dostępności. {% elif score >= 50 %} - Strona wymaga pracy nad optymalizacja SEO. Warto poprawic wydajnosc i dostepnosc. + Strona wymaga pracy nad optymalizacją SEO. Warto poprawić wydajność i dostępność. {% else %} - Strona ma powazne problemy z SEO. Priorytetowo popraw wydajnosc i optymalizacje. + Strona ma poważne problemy z SEO. Priorytetowo popraw wydajność i optymalizację. {% endif %}

- Wynik pochodzi z Google PageSpeed Insights i ocenia techniczne aspekty SEO (meta tagi, robots.txt, indeksowalnosc). - Pelna ocena SEO, wlaczajac lokalne SEO i widocznosc, jest dostepna w analizie AI ponizej. + Wynik pochodzi z Google PageSpeed Insights i ocenia techniczne aspekty SEO (meta tagi, robots.txt, indeksowalność). + Pełna ocena SEO, włączając lokalne SEO i widoczność, jest dostępna w analizie AI poniżej.

@@ -702,7 +702,7 @@ - Szczegolowe metryki + Szczegółowe metryki
@@ -728,7 +728,7 @@
-
Wydajnosc
+
Wydajność
{{ perf if perf else '-' }}
@@ -742,7 +742,7 @@
-
Dostepnosc
+
Dostępność
{{ acc if acc else '-' }}
@@ -767,60 +767,60 @@ {# --- KRYTYCZNE --- #} {% if seo_data.has_ssl == false %} - {% set _ = findings_critical.append({'title': 'Brak certyfikatu SSL', 'desc': 'Strona nie jest zabezpieczona protokolem HTTPS. Zainstaluj certyfikat SSL.'}) %} + {% set _ = findings_critical.append({'title': 'Brak certyfikatu SSL', 'desc': 'Strona nie jest zabezpieczona protokołem HTTPS. Zainstaluj certyfikat SSL.'}) %} {% endif %} {% if seo_data.seo_score is not none and seo_data.seo_score < 30 %} - {% set _ = findings_critical.append({'title': 'Bardzo niski wynik SEO (' ~ seo_data.seo_score ~ '/100)', 'desc': 'Wynik SEO ponizej 30/100 wymaga pilnej interwencji.'}) %} + {% set _ = findings_critical.append({'title': 'Bardzo niski wynik SEO (' ~ seo_data.seo_score ~ '/100)', 'desc': 'Wynik SEO poniżej 30/100 wymaga pilnej interwencji.'}) %} {% endif %} {% if seo_data.is_indexable == false %} - {% set _ = findings_critical.append({'title': 'Strona zablokowana przed indeksowaniem', 'desc': 'Wyszukiwarki nie moga indeksowac strony. Sprawdz meta robots i robots.txt.'}) %} + {% set _ = findings_critical.append({'title': 'Strona zablokowana przed indeksowaniem', 'desc': 'Wyszukiwarki nie mogą indeksować strony. Sprawdź meta robots i robots.txt.'}) %} {% endif %} {% if seo_data.performance_score is not none and seo_data.performance_score < 30 %} - {% set _ = findings_critical.append({'title': 'Krytycznie niska wydajnosc (' ~ seo_data.performance_score ~ '/100)', 'desc': 'Strona laduje sie bardzo wolno. Zoptymalizuj obrazy i kod.'}) %} + {% set _ = findings_critical.append({'title': 'Krytycznie niska wydajność (' ~ seo_data.performance_score ~ '/100)', 'desc': 'Strona ładuje się bardzo wolno. Zoptymalizuj obrazy i kod.'}) %} {% endif %} -{# --- WAZNE --- #} +{# --- WAŻNE --- #} {% if not seo_data.meta_title %} - {% set _ = findings_important.append({'title': 'Brak meta title', 'desc': 'Strona nie ma ustawionego tytulu. Dodaj meta title (50-60 znakow).'}) %} + {% set _ = findings_important.append({'title': 'Brak meta title', 'desc': 'Strona nie ma ustawionego tytułu. Dodaj meta title (50-60 znaków).'}) %} {% elif seo_data.meta_title|length < 30 %} - {% set _ = findings_important.append({'title': 'Meta title za krotki (' ~ seo_data.meta_title|length ~ ' zn.)', 'desc': 'Optymalnie 50-60 znakow. Aktualny tytul jest zbyt krotki.'}) %} + {% set _ = findings_important.append({'title': 'Meta title za krótki (' ~ seo_data.meta_title|length ~ ' zn.)', 'desc': 'Optymalnie 50-60 znaków. Aktualny tytuł jest zbyt krótki.'}) %} {% elif seo_data.meta_title|length > 70 %} - {% set _ = findings_important.append({'title': 'Meta title za dlugi (' ~ seo_data.meta_title|length ~ ' zn.)', 'desc': 'Optymalnie 50-60 znakow. Aktualny tytul jest zbyt dlugi i zostanie obciety w wynikach.'}) %} + {% set _ = findings_important.append({'title': 'Meta title za długi (' ~ seo_data.meta_title|length ~ ' zn.)', 'desc': 'Optymalnie 50-60 znaków. Aktualny tytuł jest zbyt długi i zostanie obcięty w wynikach.'}) %} {% endif %} {% if not seo_data.meta_description %} - {% set _ = findings_important.append({'title': 'Brak meta description', 'desc': 'Strona nie ma opisu. Dodaj meta description (150-160 znakow).'}) %} + {% set _ = findings_important.append({'title': 'Brak meta description', 'desc': 'Strona nie ma opisu. Dodaj meta description (150-160 znaków).'}) %} {% elif seo_data.meta_description|length < 120 %} - {% set _ = findings_important.append({'title': 'Meta description za krotki (' ~ seo_data.meta_description|length ~ ' zn.)', 'desc': 'Optymalnie 150-160 znakow. Aktualny opis jest zbyt krotki.'}) %} + {% set _ = findings_important.append({'title': 'Meta description za krótki (' ~ seo_data.meta_description|length ~ ' zn.)', 'desc': 'Optymalnie 150-160 znaków. Aktualny opis jest zbyt krótki.'}) %} {% elif seo_data.meta_description|length > 180 %} - {% set _ = findings_important.append({'title': 'Meta description za dlugi (' ~ seo_data.meta_description|length ~ ' zn.)', 'desc': 'Optymalnie 150-160 znakow. Opis zostanie obciety w wynikach wyszukiwania.'}) %} + {% set _ = findings_important.append({'title': 'Meta description za długi (' ~ seo_data.meta_description|length ~ ' zn.)', 'desc': 'Optymalnie 150-160 znaków. Opis zostanie obcięty w wynikach wyszukiwania.'}) %} {% endif %} {% if seo_data.has_sitemap == false %} - {% set _ = findings_important.append({'title': 'Brak sitemap.xml', 'desc': 'Dodaj mape witryny, aby ulatwic wyszukiwarkom indeksowanie strony.'}) %} + {% set _ = findings_important.append({'title': 'Brak sitemap.xml', 'desc': 'Dodaj mapę witryny, aby ułatwić wyszukiwarkom indeksowanie strony.'}) %} {% endif %} {% if seo_data.has_robots_txt == false %} - {% set _ = findings_important.append({'title': 'Brak robots.txt', 'desc': 'Dodaj plik robots.txt z instrukcjami dla robotow wyszukiwarek.'}) %} + {% set _ = findings_important.append({'title': 'Brak robots.txt', 'desc': 'Dodaj plik robots.txt z instrukcjami dla robotów wyszukiwarek.'}) %} {% endif %} {% if seo_data.h1_count is not none and seo_data.h1_count == 0 %} - {% set _ = findings_important.append({'title': 'Brak naglowka H1', 'desc': 'Kazda strona powinna miec dokladnie jeden naglowek H1.'}) %} + {% set _ = findings_important.append({'title': 'Brak nagłówka H1', 'desc': 'Każda strona powinna mieć dokładnie jeden nagłówek H1.'}) %} {% elif seo_data.h1_count is not none and seo_data.h1_count > 1 %} - {% set _ = findings_important.append({'title': 'Wiele naglowkow H1 (' ~ seo_data.h1_count ~ ')', 'desc': 'Strona ma ' ~ seo_data.h1_count ~ ' naglowkow H1, powinien byc jeden.'}) %} + {% set _ = findings_important.append({'title': 'Wiele nagłówków H1 (' ~ seo_data.h1_count ~ ')', 'desc': 'Strona ma ' ~ seo_data.h1_count ~ ' nagłówków H1, powinien być jeden.'}) %} {% endif %} {% if seo_data.images_without_alt is not none and seo_data.images_without_alt > 0 %} - {% set _ = findings_important.append({'title': 'Obrazy bez atrybutu alt (' ~ seo_data.images_without_alt ~ ')', 'desc': '' ~ seo_data.images_without_alt ~ ' obrazow nie ma opisu alternatywnego. Dodaj atrybuty alt.'}) %} + {% set _ = findings_important.append({'title': 'Obrazy bez atrybutu alt (' ~ seo_data.images_without_alt ~ ')', 'desc': '' ~ seo_data.images_without_alt ~ ' obrazów nie ma opisu alternatywnego. Dodaj atrybuty alt.'}) %} {% endif %} {% if seo_data.lcp_ms is not none and seo_data.lcp_ms > 4000 %} - {% set _ = findings_important.append({'title': 'Wolne ladowanie (LCP ' ~ '%.1f'|format(seo_data.lcp_ms / 1000) ~ 's)', 'desc': 'Largest Contentful Paint przekracza 4 sekundy. Cel: ponizej 2.5s.'}) %} + {% set _ = findings_important.append({'title': 'Wolne ładowanie (LCP ' ~ '%.1f'|format(seo_data.lcp_ms / 1000) ~ 's)', 'desc': 'Largest Contentful Paint przekracza 4 sekundy. Cel: poniżej 2.5s.'}) %} {% endif %} {% if seo_data.inp_ms is not none and seo_data.inp_ms > 500 %} - {% set _ = findings_important.append({'title': 'Niska interaktywnosc (INP ' ~ seo_data.inp_ms ~ 'ms)', 'desc': 'Interaction to Next Paint powinien byc ponizej 200ms.'}) %} + {% set _ = findings_important.append({'title': 'Niska interaktywność (INP ' ~ seo_data.inp_ms ~ 'ms)', 'desc': 'Interaction to Next Paint powinien być poniżej 200ms.'}) %} {% endif %} {% if seo_data.has_local_business_schema == false %} {% set _ = findings_important.append({'title': 'Brak schematu LocalBusiness', 'desc': 'Dodaj dane strukturalne Schema.org dla firmy lokalnej.'}) %} {% endif %} {% if seo_data.security_headers_count is not none and seo_data.security_headers_count < 2 %} - {% set _ = findings_important.append({'title': 'Brak naglowkow bezpieczenstwa (' ~ seo_data.security_headers_count ~ '/4)', 'desc': 'Dodaj HSTS, CSP, X-Frame-Options, X-Content-Type-Options.'}) %} + {% set _ = findings_important.append({'title': 'Brak nagłówków bezpieczeństwa (' ~ seo_data.security_headers_count ~ '/4)', 'desc': 'Dodaj HSTS, CSP, X-Frame-Options, X-Content-Type-Options.'}) %} {% endif %} {# --- DO POPRAWY --- #} @@ -828,28 +828,28 @@ {% set _ = findings_improvement.append({'title': 'Brak Google Analytics', 'desc': 'Nie monitorujesz ruchu na stronie. Zainstaluj GA4.'}) %} {% endif %} {% if seo_data.has_og_tags == false %} - {% set _ = findings_improvement.append({'title': 'Brak tagow Open Graph', 'desc': 'Linki do strony nie beda ladnie wygladac w mediach spolecznosciowych.'}) %} + {% set _ = findings_improvement.append({'title': 'Brak tagów Open Graph', 'desc': 'Linki do strony nie będą ładnie wyglądać w mediach społecznościowych.'}) %} {% endif %} {% if seo_data.has_twitter_cards == false %} - {% set _ = findings_improvement.append({'title': 'Brak Twitter Cards', 'desc': 'Brak tagow Twitter Card dla lepszego wygladu linkow na X.'}) %} + {% set _ = findings_improvement.append({'title': 'Brak Twitter Cards', 'desc': 'Brak tagów Twitter Card dla lepszego wyglądu linków na X.'}) %} {% endif %} {% if seo_data.has_canonical == false %} - {% set _ = findings_improvement.append({'title': 'Brak tagu canonical', 'desc': 'Ustaw canonical URL, aby uniknac duplikatow w indeksie.'}) %} + {% set _ = findings_improvement.append({'title': 'Brak tagu canonical', 'desc': 'Ustaw canonical URL, aby uniknąć duplikatów w indeksie.'}) %} {% endif %} {% if seo_data.has_google_maps_embed == false %} {% set _ = findings_improvement.append({'title': 'Brak mapy Google na stronie', 'desc': 'Osadzenie mapy Google Maps pomaga w lokalnym SEO.'}) %} {% endif %} {% if seo_data.nap_on_website == false %} - {% set _ = findings_improvement.append({'title': 'Brak danych NAP na stronie', 'desc': 'Dodaj nazwe firmy, adres i telefon (NAP) na stronie.'}) %} + {% set _ = findings_improvement.append({'title': 'Brak danych NAP na stronie', 'desc': 'Dodaj nazwę firmy, adres i telefon (NAP) na stronie.'}) %} {% endif %} {% if seo_data.content_freshness_score is not none and seo_data.content_freshness_score < 40 %} - {% set _ = findings_improvement.append({'title': 'Nieaktualna tresc (wynik: ' ~ seo_data.content_freshness_score ~ ')', 'desc': 'Tresc strony nie byla aktualizowana od dluzszego czasu.'}) %} + {% set _ = findings_improvement.append({'title': 'Nieaktualna treść (wynik: ' ~ seo_data.content_freshness_score ~ ')', 'desc': 'Treść strony nie była aktualizowana od dłuższego czasu.'}) %} {% endif %} {% if seo_data.modern_image_ratio is not none and seo_data.modern_image_ratio < 40 %} - {% set _ = findings_improvement.append({'title': 'Stare formaty obrazow (' ~ '%.0f'|format(seo_data.modern_image_ratio) ~ '% nowoczesnych)', 'desc': 'Konwertuj obrazy do formatow WebP lub AVIF dla lepszej wydajnosci.'}) %} + {% set _ = findings_improvement.append({'title': 'Stare formaty obrazów (' ~ '%.0f'|format(seo_data.modern_image_ratio) ~ '% nowoczesnych)', 'desc': 'Konwertuj obrazy do formatów WebP lub AVIF dla lepszej wydajności.'}) %} {% endif %} {% if seo_data.word_count_homepage is not none and seo_data.word_count_homepage < 300 %} - {% set _ = findings_improvement.append({'title': 'Malo tresci na stronie (' ~ seo_data.word_count_homepage ~ ' slow)', 'desc': 'Strona ma malo tresci. Zalecane minimum to 300 slow.'}) %} + {% set _ = findings_improvement.append({'title': 'Mało treści na stronie (' ~ seo_data.word_count_homepage ~ ' słów)', 'desc': 'Strona ma mało treści. Zalecane minimum to 300 słów.'}) %} {% endif %} {% set total_findings = findings_critical|length + findings_important|length + findings_improvement|length %} @@ -864,14 +864,14 @@ {{ total_findings }}
-

Na podstawie audytu SEO — najwazniejsze do naprawienia

+

Na podstawie audytu SEO — najważniejsze do naprawienia

{% if total_findings == 0 %}
- Nie znaleziono krytycznych problemow. Twoja strona jest dobrze zoptymalizowana. + Nie znaleziono krytycznych problemów. Twoja strona jest dobrze zoptymalizowana.
{% else %} @@ -892,7 +892,7 @@ {% if findings_important|length > 0 %}
-
Wazne ({{ findings_important|length }})
+
Ważne ({{ findings_important|length }})
{% for f in findings_important %}
!
@@ -986,11 +986,11 @@ - Dane z Chrome UX Report (realni uzytkownicy) + Dane z Chrome UX Report (realni użytkownicy)
-

Metryki p75 z realnych sesji uzytkownikow Chrome (ostatnie 28 dni)

+

Metryki p75 z realnych sesji użytkowników Chrome (ostatnie 28 dni)

{% set crux_lcp = seo_data.crux_lcp_ms %} {% set crux_lcp_class = 'good' if crux_lcp <= 2500 else ('medium' if crux_lcp <= 4000 else 'poor') %} @@ -1058,11 +1058,11 @@

Dane z Google Search za ostatnie {{ seo_data.gsc_period_days or 28 }} dni

-
Klikniecia
-
{{ '{:,}'.format(seo_data.gsc_clicks)|replace(',', ' ') }}
+
Kliknięcia
+
{{ '{:,}'.format(seo_data.gsc_clicks)|replace(',', ' ') }}
-
Wyswietlenia
+
Wyświetlenia
{{ '{:,}'.format(seo_data.gsc_impressions)|replace(',', ' ') }}
{% if seo_data.gsc_ctr is not none %} @@ -1073,7 +1073,7 @@ {% endif %} {% if seo_data.gsc_avg_position is not none %}
-
Srednia pozycja
+
Średnia pozycja
{{ '%.1f'|format(seo_data.gsc_avg_position) }}
{% endif %} @@ -1086,8 +1086,8 @@
- - + + @@ -1122,16 +1122,16 @@
-

Konto polaczone, ale brak danych

-

Twoja strona moze nie byc jeszcze dodana do Google Search Console. Wykonaj ponizsze kroki:

+

Konto połączone, ale brak danych

+

Twoja strona może nie być jeszcze dodana do Google Search Console. Wykonaj poniższe kroki:

    -
  1. Wejdz na search.google.com/search-console
  2. -
  3. Kliknij Dodaj wlasciwosc i wpisz adres strony: {{ company.website or '' }}
  4. -
  5. Zweryfikuj wlasciwosc (najlatwiej przez rekord DNS TXT lub tag HTML)
  6. -
  7. Poczekaj 2-3 dni az Google zbierze pierwsze dane
  8. -
  9. Uruchom ponownie audyt SEO — dane pojawia sie tutaj automatycznie
  10. +
  11. Wejdź na search.google.com/search-console
  12. +
  13. Kliknij Dodaj właściwość i wpisz adres strony: {{ company.website or '' }}
  14. +
  15. Zweryfikuj właściwość (najłatwiej przez rekord DNS TXT lub tag HTML)
  16. +
  17. Poczekaj 2-3 dni aż Google zbierze pierwsze dane
  18. +
  19. Uruchom ponownie audyt SEO — dane pojawią się tutaj automatycznie
{% else %} @@ -1140,8 +1140,8 @@ -

Polacz Google Search Console aby zobaczyc dane o widocznosci w wyszukiwarce

- Polacz Search Console +

Połącz Google Search Console aby zobaczyć dane o widoczności w wyszukiwarce

+ Połącz Search Console {% endif %} @@ -1164,7 +1164,7 @@
- {% if lscore >= 70 %}Dobry Local SEO{% elif lscore >= 40 %}Przecietny Local SEO{% else %}Slaby Local SEO{% endif %} + {% if lscore >= 70 %}Dobry Local SEO{% elif lscore >= 40 %}Przeciętny Local SEO{% else %}Słaby Local SEO{% endif %}

Ocena optymalizacji pod lokalne wyszukiwanie

@@ -1182,7 +1182,7 @@
{{ '✓' if seo_data.has_local_keywords else '✗' }} - Lokalne slowa kluczowe + Lokalne słowa kluczowe
{% if seo_data.nap_on_website %}
@@ -1199,7 +1199,7 @@ {% if seo_data.local_keywords_found %}
- Znalezione slowa kluczowe: + Znalezione słowa kluczowe:
{% for kw in seo_data.local_keywords_found[:10] %} {{ kw }} @@ -1221,7 +1221,7 @@
-
Swiezosc tresci
+
Świeżość treści
{{ fresh }}
{% if seo_data.last_modified_date %} @@ -1261,7 +1261,7 @@ Link {% endif %} {% elif citation.status == 'incorrect' %} - Bledne dane + Błędne dane {% else %} Nie znaleziono {% endif %} @@ -1277,7 +1277,7 @@ - Meta Tagi i Tresc + Meta Tagi i Treść
@@ -1287,7 +1287,7 @@
Meta Title - {{ title_len }} znakow {% if title_status == 'good' %}(idealnie){% elif title_len < 50 %}(za krotki){% else %}(za dlugi){% endif %} + {{ title_len }} znaków {% if title_status == 'good' %}(idealnie){% elif title_len < 50 %}(za krótki){% else %}(za długi){% endif %}
{{ seo_data.meta_title }}
@@ -1299,7 +1299,7 @@
Meta Description - {{ desc_len }} znakow {% if desc_status == 'good' %}(idealnie){% elif desc_len < 150 %}(za krotki){% else %}(za dlugi){% endif %} + {{ desc_len }} znaków {% if desc_status == 'good' %}(idealnie){% elif desc_len < 150 %}(za krótki){% else %}(za długi){% endif %}
{{ seo_data.meta_description }}
@@ -1311,7 +1311,7 @@ {% set lt = seo_data.load_time_ms %} {% set lt_status = 'good' if lt < 1000 else ('medium' if lt < 3000 else 'poor') %}
-
Czas ladowania
+
Czas ładowania
{{ '%.1f'|format(lt / 1000) }}s
{% endif %} @@ -1320,7 +1320,7 @@ {% set wc = seo_data.word_count_homepage %} {% set wc_status = 'good' if wc >= 300 else ('medium' if wc >= 100 else 'poor') %}
-
Liczba slow
+
Liczba słów
{{ wc }}
{% endif %} @@ -1343,7 +1343,7 @@ {% if seo_data.has_ssl is not none %}
{{ '✓' if seo_data.has_ssl else '✗' }} - Certyfikat SSL{% if seo_data.has_ssl and seo_data.ssl_expires_at %} (wazny do {{ seo_data.ssl_expires_at.strftime('%d.%m.%Y') }}){% endif %} + Certyfikat SSL{% if seo_data.has_ssl and seo_data.ssl_expires_at %} (ważny do {{ seo_data.ssl_expires_at.strftime('%d.%m.%Y') }}){% endif %}
{% endif %} @@ -1379,7 +1379,7 @@ {% set h1_ok = seo_data.h1_count == 1 %}
{{ '✓' if h1_ok else '⚠' }} - H1: {{ seo_data.h1_count }}{% if not h1_ok %} (powinien byc 1){% endif %}{% if seo_data.h2_count is not none %}, H2: {{ seo_data.h2_count }}{% endif %}{% if seo_data.h3_count is not none %}, H3: {{ seo_data.h3_count }}{% endif %} + H1: {{ seo_data.h1_count }}{% if not h1_ok %} (powinien być 1){% endif %}{% if seo_data.h2_count is not none %}, H2: {{ seo_data.h2_count }}{% endif %}{% if seo_data.h3_count is not none %}, H3: {{ seo_data.h3_count }}{% endif %}
{% endif %} @@ -1423,7 +1423,7 @@ {% if seo_data.is_indexable is not none %}
{{ '✓' if seo_data.is_indexable else '✗' }} - Indeksowalnosc{% if not seo_data.is_indexable and seo_data.noindex_reason %} ({{ seo_data.noindex_reason }}){% endif %} + Indeksowalność{% if not seo_data.is_indexable and seo_data.noindex_reason %} ({{ seo_data.noindex_reason }}){% endif %}
{% endif %} @@ -1465,7 +1465,7 @@ {% if seo_data.h1_text %}
- Tytul H1: + Tytuł H1: {{ seo_data.h1_text }}
{% endif %} @@ -1478,7 +1478,7 @@ - Naglowki bezpieczenstwa + Nagłówki bezpieczeństwa
@@ -1486,7 +1486,7 @@
{{ sec_count }}/4
- {% if sec_count == 4 %}Wszystkie naglowki bezpieczenstwa skonfigurowane{% elif sec_count >= 2 %}Czesciowa ochrona — brakuje {{ 4 - sec_count }} naglowkow{% else %}Slaba ochrona — wymagana konfiguracja{% endif %} + {% if sec_count == 4 %}Wszystkie nagłówki bezpieczeństwa skonfigurowane{% elif sec_count >= 2 %}Częściowa ochrona — brakuje {{ 4 - sec_count }} nagłówków{% else %}Słaba ochrona — wymagana konfiguracja{% endif %}
@@ -1516,7 +1516,7 @@ - Optymalizacja obrazow + Optymalizacja obrazów
@@ -1525,7 +1525,7 @@
{{ '%.0f'|format(ratio) }}%
-
nowoczesnych formatow
+
nowoczesnych formatów
@@ -1552,7 +1552,7 @@

Brak danych audytu SEO

{% if company.website %} -

Nie przeprowadzono jeszcze audytu SEO dla strony tej firmy. Uruchom audyt, aby sprawdzic optymalizacje strony.

+

Nie przeprowadzono jeszcze audytu SEO dla strony tej firmy. Uruchom audyt, aby sprawdzić optymalizację strony.

{% if can_audit %} {% endif %} {% else %} -

Ta firma nie ma zdefiniowanej strony WWW. Dodaj adres strony w profilu firmy, aby moc przeprowadzic audyt SEO.

+

Ta firma nie ma zdefiniowanej strony WWW. Dodaj adres strony w profilu firmy, aby móc przeprowadzić audyt SEO.

- Przejdz do profilu firmy + Przejdź do profilu firmy {% endif %}
@@ -1581,7 +1581,7 @@

Audyt SEO w toku...

-

Analiza strony moze potrwac do 30 sekund

+

Analiza strony może potrwać do 30 sekund

@@ -1590,7 +1590,7 @@
- Analiza on-page SEO (meta tagi, naglowki, obrazy) + Analiza on-page SEO (meta tagi, nagłówki, obrazy)
@@ -1606,11 +1606,11 @@
- Sprawdzanie katalogow firm + Sprawdzanie katalogów firm
- Analiza aktualnosci tresci + Analiza aktualności treści
@@ -1618,7 +1618,7 @@
- Obliczanie wyniku koncowego + Obliczanie wyniku końcowego
@@ -1639,7 +1639,7 @@
@@ -690,26 +690,26 @@
{% if score >= 90 %} - Doskonala obecnosc w Social Media + Doskonała obecność w Social Media {% elif score >= 70 %} - Dobra obecnosc w Social Media + Dobra obecność w Social Media {% elif score >= 50 %} - Przecietna obecnosc w Social Media + Przeciętna obecność w Social Media {% elif score >= 30 %} - Obecnosc wymaga rozbudowy + Obecność wymaga rozbudowy {% else %} - Slaba obecnosc w Social Media + Słaba obecność w Social Media {% endif %}

{% if score >= 80 %} - Firma jest obecna na wiekszosci waznych platform spolecznosciowych. Utrzymuj aktywnosc i rozwijaj zaangazowanie. + Firma jest obecna na większości ważnych platform społecznościowych. Utrzymuj aktywność i rozwijaj zaangażowanie. {% elif score >= 60 %} - Firma ma dobra obecnosc w social media. Rozważ dodanie brakujacych platform dla pelniejszego zasiegu. + Firma ma dobrą obecność w social media. Rozważ dodanie brakujących platform dla pełniejszego zasięgu. {% elif score >= 40 %} - Firma jest obecna na kilku platformach. Warto rozszerzyc obecnosc o kolejne kanaly komunikacji. + Firma jest obecna na kilku platformach. Warto rozszerzyć obecność o kolejne kanały komunikacji. {% else %} - Firma ma ograniczona obecnosc w social media. Zalecamy utworzenie profili na kluczowych platformach. + Firma ma ograniczoną obecność w social media. Zalecamy utworzenie profili na kluczowych platformach. {% endif %}

@@ -723,7 +723,7 @@ - {{ social_data.total_platforms - social_data.platforms_count }} brakujacych + {{ social_data.total_platforms - social_data.platforms_count }} brakujących
@@ -845,19 +845,19 @@
{% if profile.check_status == 'needs_verification' %}
- Do weryfikacji — link do profilu wymaga recznego sprawdzenia. Profil moze byc nieaktywny lub wskazywac na niewlasciwe konto. + Do weryfikacji — link do profilu wymaga ręcznego sprawdzenia. Profil może być nieaktywny lub wskazywać na niewłaściwe konto.
{% endif %} {% if platform == 'facebook' and 'profile.php?id=' in (profile.url or '') %}
- Adres profilu zawiera numeryczne ID zamiast nazwy firmy. Zalecamy ustawienie niestandardowej nazwy uzytkownika (np. facebook.com/NazwaFirmy) w ustawieniach strony na Facebooku. + Adres profilu zawiera numeryczne ID zamiast nazwy firmy. Zalecamy ustawienie niestandardowej nazwy użytkownika (np. facebook.com/NazwaFirmy) w ustawieniach strony na Facebooku.
{% endif %} {% if profile.source %}
- Zrodlo: + Źródło: - {% if profile.source == 'website_scrape' %}Ze strony WWW{% elif profile.source == 'brave_search' %}Wyszukiwarka{% elif profile.source == 'manual' %}Recznie{% elif profile.source == 'facebook_api' %}Facebook API{% else %}{{ profile.source }}{% endif %} + {% if profile.source == 'website_scrape' %}Ze strony WWW{% elif profile.source == 'brave_search' %}Wyszukiwarka{% elif profile.source == 'manual' %}Ręcznie{% elif profile.source == 'facebook_api' %}Facebook API{% else %}{{ profile.source }}{% endif %}
{% endif %} @@ -875,7 +875,7 @@ - {{ '{:,}'.format(profile.followers_count).replace(',', ' ') }} obserwujacych + {{ '{:,}'.format(profile.followers_count).replace(',', ' ') }} obserwujących
{% endif %} {% if profile.followers_history and profile.followers_history|length > 1 %} @@ -916,7 +916,7 @@
{% endif %} {% if profile.has_profile_photo %} -
+
@@ -924,7 +924,7 @@
{% endif %} {% if profile.has_cover_photo %} -
+
@@ -937,11 +937,11 @@ - {{ profile.posts_count_30d }} postow/30d + {{ profile.posts_count_30d }} postów/30d
{% endif %} {% if profile.engagement_rate is not none %} -
+
@@ -953,7 +953,7 @@ - {{ profile.posts_count_365d }} postow/rok + {{ profile.posts_count_365d }} postów/rok
{% endif %} {% if profile.last_post_date %} @@ -965,7 +965,7 @@
{% endif %} {% if profile.posting_frequency_score is not none %} -
+
@@ -998,7 +998,7 @@ {% if profile and profile.profile_completeness_score is not none %}
- Kompletnosc profilu + Kompletność profilu {{ profile.profile_completeness_score }}%
@@ -1027,7 +1027,7 @@ - Porownanie platform + Porównanie platform
@@ -1036,10 +1036,10 @@
- + - + @@ -1090,7 +1090,7 @@
!
- Facebook - Najpopularniejsza platforma w Polsce. Zalozenie strony firmowej pozwoli dotrzec do szerokiego grona klientow. + Facebook - Najpopularniejsza platforma w Polsce. Założenie strony firmowej pozwoli dotrzeć do szerokiego grona klientów.
{% endif %} @@ -1108,7 +1108,7 @@
!
- Instagram - Swietna platforma do prezentacji wizualnej firmy. Szczegolnie wazna dla firm z produktami/uslugami wizualnymi. + Instagram - Świetna platforma do prezentacji wizualnej firmy. Szczególnie ważna dla firm z produktami/usługami wizualnymi.
{% endif %} @@ -1117,7 +1117,7 @@
!
- YouTube - Druga najwieksza wyszukiwarka na swiecie. Video content buduje zaufanie i pokazuje ekspertyze. + YouTube - Druga największa wyszukiwarka na świecie. Video content buduje zaufanie i pokazuje ekspertyzę.
{% endif %} @@ -1126,7 +1126,7 @@
!
- TikTok - Najszybciej rosnaca platforma. Warto rozwazyc jesli celujecie w mlodszych odbiorców. + TikTok - Najszybciej rosnąca platforma. Warto rozważyć jeśli celujecie w młodszych odbiorców.
{% endif %} @@ -1135,7 +1135,7 @@
!
- X (Twitter) - Platforma do szybkiej komunikacji i budowania wizerunku eksperta. Przydatna w branzy tech/media. + X (Twitter) - Platforma do szybkiej komunikacji i budowania wizerunku eksperta. Przydatna w branży tech/media.
{% endif %} @@ -1158,7 +1158,7 @@
!
- Facebook - zmien adres profilu - Twoj profil na Facebooku uzywa numerycznego ID zamiast nazwy firmy. Klienci latwiej zapamietaja adres typu facebook.com/NazwaFirmy. Aby to zmienic: Ustawienia strony na Facebooku → Ogolne → Nazwa uzytkownika → wpisz nazwe firmy. + Facebook - zmień adres profilu - Twój profil na Facebooku używa numerycznego ID zamiast nazwy firmy. Klienci łatwiej zapamiętają adres typu facebook.com/NazwaFirmy. Aby to zmienić: Ustawienia strony na Facebooku → Ogólne → Nazwa użytkownika → wpisz nazwę firmy.
@@ -1175,7 +1175,7 @@

Audyt Social Media

-

Szukam profili w mediach spolecznosciowych...

+

Szukam profili w mediach społecznościowych...

@@ -1183,7 +1183,7 @@
- Skanuje strone WWW WWW + Skanuję stronę WWW WWW
@@ -1263,7 +1263,7 @@
- Zapisuje wyniki + Zapisuję wyniki @@ -1278,7 +1278,7 @@ - + @@ -1386,7 +1386,7 @@ async function animatePlatformSteps(foundPlatforms, googleData) { const delay = 400; // ms between steps - slower for readability // Website scan complete - updateStep('step-website', 'complete', 'Skanowanie strony WWW zakonczone WWW'); + updateStep('step-website', 'complete', 'Skanowanie strony WWW zakończone WWW'); await new Promise(r => setTimeout(r, delay)); // Process each platform @@ -1450,7 +1450,7 @@ async function runAudit() { await animatePlatformSteps(foundPlatforms, googleData); // Save step - updateStep('step-save', 'in_progress', 'Zapisuje wyniki do bazy...'); + updateStep('step-save', 'in_progress', 'Zapisuję wyniki do bazy...'); await new Promise(r => setTimeout(r, 400)); if (response.ok && data.success) { @@ -1460,18 +1460,18 @@ async function runAudit() { // Wait longer for user to see complete results await new Promise(r => setTimeout(r, 4000)); hideLoading(); - showModal('Audyt zakonczony', `Znaleziono ${data.profiles_found || 0} profili social media. Strona zostanie odswiezona.`, true); + showModal('Audyt zakończony', `Znaleziono ${data.profiles_found || 0} profili social media. Strona zostanie odświeżona.`, true); setTimeout(() => location.reload(), 2000); } else { - updateStep('step-save', 'error', 'Blad zapisu: ' + (data.error || 'nieznany blad')); + updateStep('step-save', 'error', 'Błąd zapisu: ' + (data.error || 'nieznany błąd')); await new Promise(r => setTimeout(r, 4000)); hideLoading(); - showModal('Blad', data.error || 'Wystapil nieznany blad podczas audytu.', false); + showModal('Błąd', data.error || 'Wystąpił nieznany błąd podczas audytu.', false); if (btn) btn.disabled = false; } } catch (error) { hideLoading(); - showModal('Blad polaczenia', 'Nie udalo sie polaczyc z serwerem: ' + error.message, false); + showModal('Błąd połączenia', 'Nie udało się połączyć z serwerem: ' + error.message, false); if (btn) btn.disabled = false; } } @@ -1545,9 +1545,9 @@ async function runAIAnalysis(force) { const results = document.getElementById('aiResults'); results.innerHTML = `
-

Blad analizy AI

-

${escapeHtml(data.error || 'Nieznany blad')}

- +

Błąd analizy AI

+

${escapeHtml(data.error || 'Nieznany błąd')}

+
`; results.style.display = 'block'; } @@ -1559,9 +1559,9 @@ async function runAIAnalysis(force) { const results = document.getElementById('aiResults'); results.innerHTML = `
-

Blad polaczenia

+

Błąd połączenia

${escapeHtml(error.message)}

- +
`; results.style.display = 'block'; } @@ -1585,7 +1585,7 @@ function renderAIResults(data) { actionsList.innerHTML = ''; const actions = data.actions || []; - const priorityLabels = {critical: 'KRYTYCZNE', high: 'WYSOKI', medium: 'SREDNI', low: 'NISKI'}; + const priorityLabels = {critical: 'KRYTYCZNE', high: 'WYSOKI', medium: 'ŚREDNI', low: 'NISKI'}; actions.forEach((action, idx) => { const impact = action.impact_score || 5; @@ -1596,31 +1596,31 @@ function renderAIResults(data) { card.innerHTML = `
- ${priorityLabels[action.priority] || 'SREDNI'} + ${priorityLabels[action.priority] || 'ŚREDNI'} ${escapeHtml(action.title || '')}

${escapeHtml(action.description || '')}

-
Wplyw: ${impact}/10
+
Wpływ: ${impact}/10
-
Wysilek: ${effort}/10
+
Wysiłek: ${effort}/10
- +
`; @@ -1642,7 +1642,7 @@ async function generateContent(actionType, idx) { container.style.display = container.style.display === 'none' ? 'block' : 'none'; return; } - container.innerHTML = '
Generowanie tresci...
'; + container.innerHTML = '
Generowanie treści...
'; container.style.display = 'block'; try { const response = await fetch('/api/audit/generate-content', { @@ -1667,15 +1667,15 @@ async function generateContent(actionType, idx) { } else { container.innerHTML = `
- ${escapeHtml(data.error || 'Blad generowania')} - + ${escapeHtml(data.error || 'Błąd generowania')} +
`; } } catch (error) { container.innerHTML = `
${escapeHtml(error.message)} - +
`; } }
ZapytanieKliknieciaWyswietleniaKliknięciaWyświetlenia CTR Pozycja
PlatformaObserwujacyObserwujący Engagement Posty (30d)KompletnoscKompletność