Um noch mehr Senf dazuzugeben:
zur Zeit beschäftige ich mich mit einem Projekt, das zweisprachig gestaltet werden soll, deutsch und englisch.
Wenn du dir Sorgen um die Suchmaschinenfreundlichkeit machst, dann bleibt dir gar nichts anderes übrig, als jede Sprache in einem eigenen URL-Pfad unterzubringen. Nur auf diese Weise kannst du sicherstellen, dass wirklich alle Seiten aller Sprachen von Automaten erkannt werden.
Auf eine Auswahl über Cookies, von jedwelchem Javascript-Spielkram ganz zu schweigen, ist in dieser Hinsicht kein Verlass, auch wenn Google damit mittlerweile leidlich umgehen kann.
Die angesprochene Multiviews-Methode mit /blafasel/index.de.php ist für meinen Geschmack aus mehreren Gründen eine schlechte. Du müsstest dasselbe Skript mehrfach speichern (weiteres siehe unten) und die Angabe von /blafasel/index.xyz ist in meinen Augen überflüssig (/blafasel/ reicht) und zudem ausgesprochen hässlich, wenn man auch noch auf .php verweist, weil unlogisch (der Besucher möchte kein PHP-Skript sehen, sondern ein HTML-Dokument, also sollte die Endung .html sein, nicht .php).
Deine Möglichkeiten würden sich bis hier schon mal auf die Frage beschränken, ob du lieber /de/blafasel/, ein Hauptverzeichnis je Sprache für alle Seiten, benutzen willst oder /blafasel/de/, ein Unterverzeichnis je Seite je Sprache.
Letzteres bietet zweierlei Vorteile:
Unter /blafasel/ erfolgt eine automatische Wahl entsprechend der vom Browser gemeldeten Präferenz Accept-Language oder der Benutzereinstellung, /blafasel/de und /blafasel/en bleiben festgelegt auf die jeweilige Sprache. Es könnte ja durchaus sein, dass sich mal jemand ausdrücklich auf eine Formulierung in einer Sprachfassung bezieht ("Das ist auf Englisch aber anders als auf Deutsch beschrieben!!einself").
Je nach Webserver hast du zudem eine einfache Möglichkeit, je Seite nur ein Skript speichern zu müssen: /blafasel/index.php. Die Adresse lautet hier /blafasel/, ihr Aufruf führt wie bekannt zur Ausführung von /blafasel/index.php. Bei Aufruf von /blafasel/de/ würde weiterhin /blafasel/index.php ausgeführt, das Anhängsel /de/ bekommst du zusätzlich in der Variablen $_SERVER["PATH_INFO"] übermittelt.
Beim Apache-Webserver in Verbindung mit PHP ist Option IIRC normalerweise eingeschaltet, weitere Infos siehe https://httpd.apache.org/docs/2.4/mod/core.html#acceptpathinfo
Der Nachteil ist eine etwas verschlungene Pfadstruktur. Unterseiten von /blafasel/de/ liegen nicht unter /blafasel/de/dings/ sondern unter /blafasel/dings/de. Die Variante /de/blafasel/ und /de/blafasel/dings/ ist zweifelsohne geradliniger. Sie erfordert allerdings Klimmzüge bei der Organisation der Skripte, um doppelte Speicherung zu vermeiden.
Bei anderen Völkern werden URLs gar nicht direkt auf Skriptdateien umgesetzt, sondern jede URL landet bei einem zentralen Skript und wird dort sozusagen von Hand aufgebrochen:
app = Application([
url(r"/", MainHandler),
url(r"/story/([0-9]+)", StoryHandler, dict(db=db), name="story")
])
(Nur mal als Anregung ein Stück Python aus dem Tornado-Server; du siehst hier, wie zwei Pfade, "/" und "/story/123", mittels regulärer Ausdrücke für Unterfunktionen namens MainHandler und StoryHandler registriert werden. Mit PHP geht sowas natürlich auch und hier wäre der Ansatz, Pfade nach dem Schema /de/blafasel/ ohne Doppelgemoppel abzuarbeiten.)
Die Möglichkeit, eine Sprache manuell zu wählen, solltest du auf jeder Seite vorsehen. Manche Leute sprechen weder die eine, noch die andere Sprache gut und behelfen sich damit, von allem etwas aufzuschnappen.
Von einer Sprachfassung sollten alle Verweise ausschließlich auf Seiten in dieser Sprachfassung gehen, unabhängig von der Sprachwahl: In /blafasel/de/ wird nur auf /blafasel/dings/de verwiesen. Selbst wenn jemand Englisch eingestellt hat, wird es seinen Grund haben, dass er eine deutschsprachige Seite aufgerufen hat und dieser Grund dürfte weiter Bestand haben, wenn er zur nächsten Seite wechselt.
Dann wäre da noch die Möglichkeit, alle Skripte zu duplizieren, die Texte darin zu übersetzen und in getrennten, der Sprache zugehörigen Unterordnern abzuspeichern. Scheint mir am besten zu sein.
Du möchtest deinen Seiten- und Programmcode nicht doppelt speichern; du möchtest die Texte in mehreren Sprachen speichern. Denselben Kram an mehreren Stellen zu definieren ist eine Garantie, über kurz oder lang eine Änderung an einem der Speicherorte vergessen durchzuführen.
Die übliche PHP-Nutzung bringt leider mit sich, dass alles in eine Datei gewürgt wird: Programm, Seitenstruktur, Text (gerne auch noch CSS und Javascript). Insofern wirst du vor allem bei diesem Aspekt umdenken müssen.
Je Seite ein Skript, eine HTML-Datei, mehrere Text-Dateien, dabei je Sprache eine Text-Datei. Die Text-Datei wird je nach Sprache vom aufgerufenen Skript hinzugeladen und ihr Inhalt in das Gerüst der HTML-Datei eingebaut.
Um nochmal aus der Tornado-Anleitung zu klauen:
<html>
<head>
<title>FriendFeed - {{ _("Sign in") }}</title>
</head>
<body>
<form action="{{ request.path }}" method="post">
<div>{{ _("Username") }} <input type="text" name="username"/></div>
<div>{{ _("Password") }} <input type="password" name="password"/></div>
<div><input type="submit" value="{{ _("Sign in") }}"/></div>
</form>
</body>
</html>
Beachte die geschweiften Klammern. Solche Vorlagensysteme (Neudeutsch Templates) gibt es sicher auch fix und fertig für PHP.