Kategorien
PHP Zend Framework

Internationalisierung/Mehrsprachigkeit von PHP Projekten mit .po und .mo

Für ein mehrsprachiges PHP Projekt sollte man von Anfang an alle Wörter auslagern bzw. markieren, die in einer anderen Sprache übersetzt werden sollen. Dazu bietet sich die in PHP enthaltene Funktion gettext an:

<?php echo gettext("Einen schönen Tag noch"); ?>

oder der Alias (welcher nicht zu empfehlen ist, weil man nicht danach zu kann ordentlich)

<?php echo _("Einen schönen Tag noch"); ?>

Damit kann man zu übersetzenden Text markieren und später übersetzen lassen und dann dynamisch austauschen lassen , wenn auf der englischen Webseiten gesurft wird.

Wenn man sein Projekt mit gettext programmiert hat, kann man am Ende ganz einfach tabellenartige Dateien generieren aus dem Quellcode mit Poedit. Dort kann mann sehr übersichtlich die Übersetzung der Strings eintragen bis hin zu Pluralformen von Wörtern.

Kategorien
IT-Recht XT-Commerce

Buttonlösung Gesetzesänderung für Online Shops

Bis zum 01.08.2012 müssen Onlinehändler, die über ihren Online Shop (auch) an Endkunden Produkte verkaufen, die Vorgaben der so genannten Buttonlösung umsetzen auf der finalen Seite, auf der der Verbraucher seine Bestellung auslöst.

  1. Erfüllung erweiterter Informationspflichten
  2. Gestaltung des Bestellbuttons

Bei einer Missachtung der Gesetzänderung handelt der Onlinehändler wettbewerbswidrig. Bei falscher Beschriftung des Button kommt kein Vertrag mit dem Kunden zustande.

Für die Schweiz/Österreich gilt der deutsche Gesetzesentwurf auch, sofern sich das Angebot auch an deutsche Kunden richtet: siehe Buttonlösung Schweiz.

1. Erfüllung erweiterter Informationspflichten

Es muss klar und verständlich (deutlich hervorgehoben) für den Verbraucher dargestellt werden, wenn

  • markanten Produktmerkmale
  • Angabe der Mindestlaufzeit von Verträgen (wenn vorhanden)
  • „den Gesamtpreis der Ware oder Dienstleistung einschließlich aller damit verbundenen Preisbestandteile sowie alle über den Unternehmer abgeführten Steuern oder, wenn kein genauer Preis angegeben werden kann, seine Berechnungsgrundlage, die dem Verbraucher eine Überprüfung des Preises ermöglicht“
  • Angabe aller Versandkosten und Zusatzkosten (z.B: Zoll): „gegebenenfalls zusätzlich anfallende Liefer- und Versandkosten sowie einen Hinweis auf mögliche weitere Steuern oder Kosten, die nicht über den Unternehmer abgeführt oder von ihm in Rechnung gestellt werden“
  • die Befristung bei zeitlich beschränkten Angeboten

Der genaue Gesetzestext: § 1 Informationspflichten bei Fernabsatzverträgen.

2. Der Button auf der finalen Verkaufsabschlusseite

Der Button muss unterhalb der in Punkt 1 benannten Informationen platziert sein und nicht mehrmals auf der Seite vorkommen. Zwischen diesen Informationen dürfen keine weiteren sichtbaren Elemente platziert werden, wie z.B: Checkboxen oder Input-Felder.

Die Button sollte folgender Maßen beschriftet sein ohne weitere Zusätze:

  • Zahlungspflichtig bestellen (Musterbeschriftung vom Gesetzgeber)
  • Kaufen
  • Kostenpflichtig bestellen
  • Zahlungspflichtigen Vertrag schließen
  • Kauf abschließen

Unzulässige Beschriftungen:

  • Bestellung absenden
  • Weiter
  • Bestellen
  • Entscheiden Sie sich für uns!
  • Kauf abschließen und sich verwöhnen lassen

Beispiel für eine erfolgreiche Umsetzung der neuen Regelungen: zeedee-shop.com

empfehlenswerte weiterführende Lektüre: Leitenfaden Buttonlösung IT-Recht Kanzlei München.

Dieser Artikel ersetzt keine Rechtsberatung beim Anwalt und es wird auch nicht für die Richtigkeit gehaftet. Ich empfehle einen IT-Recht Anwalt zu kontaktieren: Kanzlei Bilk & Keil.

Kategorien
PHP

PHP Rätsel: Wieso hat das Umlaute Array nur 35 Einträge?

Ich arbeite gerade an einer Funktion mit der man String, die mit PHP htmlentities() Funktion Umgewandelt worden sind:

Rauml;tsel

zurück zu wandeln in

Rätsel

weil jemand die Werte so in die Datenbank gespeichert hat, wahrscheinlich ich 🙂

Dazu hab ich die folgende Funktion gebaut, die mir komischerweise ein Array durchläuft, dass nicht die Werte beinhaltet, die man erwarten würde:

HtmlEntitesReplacer::displayHtmlEntities();
class HtmlEntitesReplacer
{

    public static function displayHtmlEntities()
    {
        $i = 0;
        $umlaute = HtmlEntitesReplacer::getUmlauteArray();
        echo "Das Umlaute Array hat ".count($umlaute)." Werte<br>";
        foreach($umlaute  as $umlautFalsch  =>$umlaut)
        {
            $htmlEnties = str_replace("&amp;", "&amp;amp;",htmlentities($umlaut));
            echo "$i) $umlautFalsch <=> $htmlEnties' <=> $umlaut <br> ";
            $i++;
        }
        die();
    }

    private function getUmlauteArray()
    {
        return array(
            'ü'=>'ü',
            'ä'=>'ä',
            'ö'=>'ö',
            'Ö'=>'Ö',
            'ß'=>'ß',
            'Ã '=>'à',
            'á'=>'á',
            'â'=>'â',
            'ã'=>'ã',
            'ù'=>'ù',
            'ú'=>'ú',
            'û'=>'û',
            'Ù'=>'Ù',
            'Ú'=>'Ú',
            'Û'=>'Û',
            'Ãœ'=>'Ü',
            'ò'=>'ò',
            'ó'=>'ó',
            'ô'=>'ô',
            'è'=>'è',
            'é'=>'é',
            'ê'=>'ê',
            'ë'=>'ë',
            'À'=>'À',
            'Á'=>'Á',
            'Â'=>'Â',
            'Ã'=>'Ã',
            'Ä'=>'Ä',
            'Ã…'=>'Å',
            'Ç'=>'Ç',
            'È'=>'È',
            'É'=>'É',
            'Ê'=>'Ê',
            'Ë'=>'Ë',
            'ÃŒ'=>'Ì',
            'Í'=>'Í',
            'ÃŽ'=>'Î',
            'Ï'=>'Ï',
            'Ñ'=>'Ñ',
            'Ã’'=>'Ò',
            'Ó'=>'Ó',
            'Ô'=>'Ô',
            'Õ'=>'Õ',
            'Ø'=>'Ø',
            'Ã¥'=>'å',
            'æ'=>'æ',
            'ç'=>'ç',
            'ì'=>'ì',
            'í'=>'í',
            'î'=>'î',
            'ï'=>'ï',
            'ð'=>'ð',
            'ñ'=>'ñ',
            'õ'=>'õ',
            'ø'=>'ø',
            'ý'=>'ý',
            'ÿ'=>'ÿ',
            '€'=>'€'
        );
    }

kommt bei der Ausgabe nur auf i=34, obwohl es 57 Sonderzeichen von der Methode getUmlauteArray() zurückgegeben werden.

Kategorien
PHP

Google Shopping API: gshoppingcontent-php für PHP 5.2 downgraden

Eine kleine Veränderungen der Hauptdatei der Google Shopping Bibliothek gshoppingcontent-php macht die Bibliothek auch unter PHP kleiner 5.3. nutzbar:

einfach ab Zeile 54 die Definition der Konstanten ändern, da nur PHP>5.2 die Defintion von Konstanten mit const ausserhalb von Klassen erlaubt:

define('CLIENTLOGIN_URI' , 'https://www.google.com/accounts/ClientLogin');

/**
 * Service name for ClientLogin.
 **/
define('CLIENTLOGIN_SVC' , 'structuredcontent');

/**
 * Auth scope for authorizing against the Content API for Shopping.
 **/
define('OAUTH_SCOPE' , 'https://www.googleapis.com/auth/structuredcontent');

/**
 * User Agent string for all requests.
 **/
define('USER_AGENT' , 'scapi-php');

/**
 * Base API URI.
 **/
define('BASE' , 'https://content.googleapis.com/content/v1/');

/**
 * Google's endpoint for OAuth 2.0 authentication.
 **/
define('AUTH_URI' , 'https://accounts.google.com/o/oauth2/auth');

/**
 * Google's endpoint for exchanging OAuth 2.0 tokens
 **/
define('TOKEN_URI' , 'https://accounts.google.com/o/oauth2/token');

/**
 * Google's endpoint for revoking OAuth 2.0 tokens
 **/
define('REVOKE_URI' , 'https://accounts.google.com/o/oauth2/revoke');
Kategorien
PHP WordPress

WordPress Plugin selber erstellen Tutorial

Wenn man WordPress erweitert, sollte man immer seinen eigenen Code sauber von dem WordPress Core  trennen und ein Plugin programmieren. Ein weiterer Vorteil ist, dass man sein hard ercodetes Plugin natürlich auch in das WordPress Plugin Verzeichnis stellen kann nach Vollendung.

Follgende Schritte sind durchzuführen:

Kategorien
PHP SEO WordPress

WordPress SEO: Meta Description Tag einbauen

WordPress ist sehr sparsam mit Meta-Tags, um das Description Tag einzubauen, muss man folgenden Code in die header.php einbauen:

<meta name="description" content="<?php if ( is_single() ) {
        single_post_title('', true);
    } else {
        bloginfo('name'); echo " - "; bloginfo('description');
    }
    ?>" />

 

Kategorien
PHP Zend Framework

Zend APIs: einzelne Komponenten verwenden

Das Zend Framework enthält viele praktische Schnittstellen zu bekannten APIs:

  1. Google Base (Zend_Gdata)
  2. Open ID (Zend_OpenId)
  3. Zend_Service mit:
  • Zend_Service_Akismet
  • Zend_Service_Amazon
  • Zend_Service_Amazon_EC2
  • Zend_Service_Amazon_S3
  • Zend_Service_Audioscrobbler
  • Zend_Service_Delicious
  • Zend_Service_DeveloperGarden
  • Zend_Service_Ebay
  • Zend_Service_Ebay_Finding
  • Zend_Service_Flickr
  • Zend_Service_LiveDocx
  • Zend_Service_Nirvanix
  • Zend_Service_ReCaptcha
  • Zend_Service_ShortUrl
  • Zend_Service_Simpy
  • Zend_Service_SlideShare
  • Zend_Service_StrikeIron
  • Zend_Service_Technorati
  • Zend_Service_Twitter
  • Zend_Service_WindowsAzure
  • Zend_Service_Yahoo

Eine komplette Liste gibt es hier.

Solche APIs können folgender Maßen eingebunden werden ohne die ganze Webseite als Zend-Projekt programmieren zu müssen (am Bsp. von GBase: Google Base):

Kategorien
SEO WordPress

SEO: Google Autoren Foto anzeigen

Wenn man sein Foto in den Suchergebnissen neben seinen Google Suchtreffern anzeigen will, muss folgende Schritte unternehmen:

  1. Anmeldung bei Google+, im Profil unter macht mit bei die eigene Webseite angeben (Achtung bei mit www und ohne)
  2. den Namen des Autors taggen auf der eigenen Webseite, Bsp: <a href=“https://plus.google.com/107751823415469819633?rel=author“>Sebastian  Viereck</a>
  3. Urheberschaft bei Google verifizieren mit einer Adresse der Domain z.B: seo-google@sebastianviereck.de
  4. Anschließend sollte mit dem Rich Snippets Testing Tool von Google noch einmal verifiziert werden, ob alle Informationen vorhanden sind. Bei mir musste das Google+ Profile nochmals verknüpft werden, siehe Screenshot
Are you the author? If you have an email with sebastianviereck.de and verified it with Google+, please enter your G+ profile to verify your authorship here:

Kategorien
Android C C++ iPhone/iOS Java Mobil MySQL PHP Web Frontend

Teil 2: Clean Code – richtige und falsche Kommentare

Nach dem Buch (Kapitel 4):  „Clean Code – Refactoring, Patterns, Testen und Techniken für sauberen Code“ von Robert C. Martin.

„Kommentieren Sie schlechten Code nicht – schreiben Sie ihn um.“

(Brian W. Kernighan und P.J. Plaugher)

 

Kommentare können beides sein, hilfreich und hinderlich:

  • hinderlich, wenn Sie überholt sind und Fehlinformationen liefern
  • störend, wenn Sie zu lang sind und unnötig
  • hilfreich, wenn Sie wohlplatziert sind

Der Einsatz von Kommentaren „soll unsere Unfähigkeit ausgleich, uns in unserem Code klar auszudrücken“(S.85). Bevor man einem Kommentar schreibt, sollte man vorher überlegen, ob der Code nicht noch ausdrucksstarker geschrieben werden könnte.

Kategorien
C C++ Java Mobil PHP Web Frontend Webdeveloper Tools

Code kopieren Zeilennummern löschen Regex

Beim Kopieren von Code von Webseiten(z.B. Zend.com) kann es vorkommen, dass der Code Zeilennummern enthält, z.B.

  1. // Parameters for ClientAuth authentication
  2. $service = Zend_Gdata_Gbase::AUTH_SERVICE_NAME;
  3. $user = „sample.user@gmail.com“;
  4. $pass = „pa$$w0rd“;
  5. // Create an authenticated HTTP client
  6. $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
  7. // Create an instance of the Base service
  8. $service = new Zend_Gdata_Gbase($client);
Um die Zeilennumern zu löschen, kann mit z.B. mit Netbeans folgenden Befehl ausführen:
STRG+H (SEARCH and REPLACE)
Find what: [0-9]{1,2}.\n
Replace with: (leer lassen)
Auswählen: Regular Expressions
Regular Expressions Netbeans