Spiele multilingual gestalten - Ist es der Aufwand wert?

Übersicht Sonstiges Smalltalk

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

M0rgenstern

Betreff: Spiele multilingual gestalten - Ist es der Aufwand wert?

BeitragMi, Apr 25, 2012 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Leute.
Was meint ihr zu dem Thema oben? Meint ihr, man sollte Spiele so programmieren, dass mehrere Sprachen gewählt werden können oder sollte man sich lieber auf eine Sprache beschränken?
Also ich persönlich muss sagen, dass ich eher dazu tendieren würde, alles auf Englisch zu machen, da die Leute das vor allem von kleineren Spielen gewohnt sind.

Eure Meinung würde mich mal interessieren.

Lg, M0rgenstern

BladeRunner

Moderator

BeitragMi, Apr 25, 2012 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Du andere Sprachen anbieten willst sei dir sicher dass Du korrekte und stimmige Übersetzungen hast. Nebenbei ein Grund weshalb ich primär Deutsch nehmen würde, solange ich nicht jemanden mit sehr guten Englischkenntnissen draufgucken lassen kann. Muttersprachler sind natürlich ideal.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

FireballFlame

Betreff: Re: Spiele multilingual gestalten - Ist es der Aufwand wert?

BeitragMi, Apr 25, 2012 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
M0rgenstern hat Folgendes geschrieben:
Meint ihr, man sollte Spiele so programmieren

Der Programmieraufwand dafür ist nicht allzu hoch, also würde ich das nicht als Kriterium heranziehen.
Aber die Übersetzung selbst stellt natürlich einen gewissen Aufwand dar. Daher stimme ich dem zu, was BladeRunner bereits schrieb.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Xeres

Moderator

BeitragMi, Apr 25, 2012 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Es kommt darauf an, wen du erreichen willst. Tendenziell kommen jüngere Leute sicher gut mit Englisch zurecht. Minecraft wurde Millionen mal verkauft, bevor die Lokalisierung kam.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ZaP

BeitragMi, Apr 25, 2012 16:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Es lohnt sich, ein Spiel (auch) auf Englisch anzubieten. Die dazu Technik ist einfach, der Übersetzungsaufwand kann aber hoch werden, je nach Inhalt, wie FireballFlame schon meinte.
Wenn Du ein Minispiel machst, kannst Du auch überlegen, ob Du nicht vielleicht sogar ganz ohne Text auskommst.
Starfare: Worklog, Website (download)

Lakorta

BeitragMi, Apr 25, 2012 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Kommt drauf an, wie viel Text drin enthalten ist. Für ein RPG würde ich schon mehrere Sprachen (wie shcon von meinen Vorpostern angemerkt: Auf die Richtigkeit der Übersetzung achten!) anbieten, bei einem eher sinnfreie Hack 'n Slay o.ä., wo die Story eher im Hintergrund steht oder sogar nur teilwiese bis gar nicht enthalten ist, reicht eine Sprache aus Wink
Soweit meine Meinung.
---
 

PhillipK

BeitragMi, Apr 25, 2012 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich persönlich stehe auf Multilingual.
Man findet immer ein paar Leutchen, die sehr gut eine andere Sprache beherrschen oder eben Muttersprachler sind - texte übersetzen zu lassen ist kein akt, vorallem nicht, wenn man mit 1-2 scheinchen wedelt. Dazu dann noch ein bekannter der Korrektur liest, fertig. (Oder eben man selbst)

Der vorteil ist meiner meinung nach, das etwas viel mehr hermacht, wenn man nur eine weitere Sprache anbietet - und die personenzahl die man ansprechen kann, ist auch viel größer.

Die technik ist ebenso einfach: Man braucht eine Funktion, die diverse tokens (zb $item_wep_slasher) aus einer Textdatei ausliest (bzw aus einem Array oder ähnlichem) und an der passenden stelle einfügt.

Ergo: Mehrere textdateien / inidateien, die (am besten durch einen Editor!^^) erstellt werden müssen, eine Funktion die einen Token-string annimmt und die wörter zurrückgibt.

Firstdeathmaker

BeitragMi, Apr 25, 2012 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich persönlich versuche meine Spiele nur in englisch zu machen. Ich meine fast alle Leute meiner Zielgruppe (Menschen mit einem Fable für Spaceshooter) sollten englisch verstehen können, von daher ist das okay so. Aber ich programmiere zur Zeit ja auch nur hobbymässig Freeware.

Wenn ich allerdings ein Spiel für kleine Kinder oder ältere Menschen entwickeln würde, wäre eine Lokalisation sofern ich auf anderen Märkten präsent sein möchte fast schon Zwang. Vor allem wenn ich es verkaufen möchte.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

M0rgenstern

BeitragMi, Apr 25, 2012 18:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Also... Irgendwie scheine ich ne komische Vorstellung zu haben...
Zitat:
Der Programmieraufwand dafür ist nicht allzu hoch, also würde ich das nicht als Kriterium heranziehen.

Ich stelle mir den Programmieraufwand schon immens vor, vor allem, wenn man Variablen aus dem Code mit reinbringen will. Einfachstes Beispiel: Punktestand.
Auf Deutsch hätte man ja: Code: [AUSKLAPPEN]
"Punkte: " + Player.Score()

Auf Englisch: Code: [AUSKLAPPEN]
"Score: " + Player.Score()

Klar, sowas wäre noch einfach umzusetzen. Aber da ihr auch RPGs angesprochen habt, mal ein Beispiel:
Man möchte eine Quest wie "Finde 5 mal Gegenstand X und 3 mal Gegenstand Y!". Zum einen ist die Satzstellung wahrscheinlich in anderen Sprachen nicht mehr die Gleiche und wenn man die Gegenstände variabel machen möchte (noch ein Beispiel: Sonderangebote bei einem Händler).
Irgendwie kann ich mir nicht vorstellen, wieso das programmiertechnisch wenig aufwand sein soll.

Lg, M0rgenstern.

Xeres

Moderator

BeitragMi, Apr 25, 2012 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kommt natürlich auf die Größe des Spiels bzw. des Textes an. Für was kleines braucht man wie erwähnt eigentlich nur ein Array. Für große Spiele muss man alles Variabel auslesen können, z.B. für jeden Gegenstand den passenden Text. Wenn das System erst mal steht, ist es einfach, viele Übersetzungen hinzuzufügen. Bis dahin ist es einfacher, alles in einer Sprache zu halten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Firstdeathmaker

BeitragMi, Apr 25, 2012 18:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Morgenstern:

Ich würde das ganze folgendermaßen lösen:

Eine Globale Klasse in der ich für alle Texte eine bestimmte Variable hab, die dann bei Spielstart mit den jeweiligen Texten gefüllt wird.

Für die Variablen Inhalte des Textes würde ich Platzhalter a la $1 usw. definieren. Die kann der Übersetzer dann an die entsprechende Stelle setzen und für das Anzeigen im Spiel überlegst du dir irgend eine Schlaue Methode welche vorher die Platzhalter Variablen mit den Werten füllst. z.B.:

Hello %1, bring me %2 of %3 and I will reward you with %4.

Hallo %1, wenn du mir %2 mal %3 bringst, werde ich dir als Belohnung %4 geben.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

The Shark

BeitragMi, Apr 25, 2012 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
2 Funktionen:

1. getString(identifier) -> gibt einen String aufgrund eines identifiers (String) zurück
Code: [AUSKLAPPEN]
getString("Score")   -> Deutsch "Punkte: " Englisch "Score: "


2. parseString(string, str1, str2="", str3="", str4="", str5="", str6="") -> ersetzt %x durch den inhalt von strx
Code: [AUSKLAPPEN]
getString("quest1") -> Deutsch "Finde %1 mal Gegenstand %2 und %3 mal Gegenstand %4!"

parseString(getString("quest1"),"5",getstring("itemDragonegg"),"2",getString("itemMushroom"))


Sind beide mit relativ wenig Aufwand zu schreiben Wink

EDIT: FDM hatte die gleiche Idee und war schneller Wink
Rette deine Freiheit

FireballFlame

BeitragMi, Apr 25, 2012 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein extra parseString braucht man gar nicht.

Ein simples
BlitzBasic: [AUSKLAPPEN]
GetString("Score") + score
GetString("Find2Items", quantity1, item1, quantity2, item2)
würde genügen.

Und in einer .ini-Datei steht dann beispielsweise
Zitat:
[de]
Score = "Punkte: "
Find2Items = "Bringe mir %1mal %2 und %3mal %4!"


Satzstellung dürfte damit auch kein Problem sein, denn man kann die Reihenfolge der %-Variablen ja in jeder Übersetzung beliebig variieren ("Hast du %2? Ich brauche %1 Stück davon...").
Alles weitere, wie z.B. eine variable Anzahl benötigter Itemtypen statt nur 2, ist eher eine Sache der Spielmechanik und wäre auch ohne Übersetzung nicht viel einfacher. (For-Schleife durch alle Items, jeweils durch Komma getrennt an einen String anfügen, nur am Ende stattdessen ein "und" benutzen. Der einzige Unterschied ist, dass du das "und" übersetzen musst.)
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Amazorn

BeitragDo, Apr 26, 2012 9:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Es kommt auf das Spiel an würde ich sagen. Bei Schach ist es egal, bei einem Textadventure sieht es schon anders aus. Very Happy

ChaosCoder

BeitragDo, Apr 26, 2012 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon guter Ansatz, allerdings ist
Code: [AUSKLAPPEN]
GetString("Find2Items", quantity1, item1, quantity2, item2)
gut gewollt, aber mit BlitzMax kaum machbar, wenn man nicht für jede Anzahl an zu übergebenen Werten eine eigene Methode schreiben will. (Oder bin ich da falsch informiert? In anderen Sprachen gibt es ja durchaus solche Konstrukte)

Man könnte natürlich einfach ein Array übergeben, welches aus Strings besteht (Da muss man aber elementare Datentypen extra casten, wenn ich mich recht entsinne).

Was aber auch wichtig ist, sind lokalisierte Ressourcen!
Ob Bilder (stellt euch ein Logo vor, das übersetzt worden ist), Sounds (z.B. Sprachdateien) oder auch Datensätze für verschiedene Sprachen sollten auch von der Klasse gefunden werden.

Da ich iOS-Entwickler bin, kenne ich diesen Automatismus aus den ObjC Bibliotheken:
Apple macht das mit besonderen Ordnern (de.lproj, en.lproj oder auch English.lproj), die an den Pfaden abgelegt werden, wo die Datei zu finden sein sollte.

Wenn man z.B. das Bild "Graphics/Menu/Logo.png" laden möchte,
geschieht automatisch (was nicht direkt in BlitzMax umzusetzen wäre, es sei denn, man schreibt alle Load-Methoden usw. um) folgendes: Die Klasse kennt die aktuelle Sprache (z.B. Deutsch) und versucht dann die Datei "Graphics/Menu/de.lproj/Logo.png" zu laden. Wenn das nicht möglich ist (z.B. weil die Datei garnicht lokalisiert wurde), nimmt sie den ursprünglichen Pfad.

In BlitzMax müsste man dann halt bei jeder Load-Methode die Lokalisierungs-Klasse vorschalten, die aus dem Dateipfad den lokalisierten Pfad macht, falls die Datei vorhanden ist und falls nicht, den ursprünglichen Pfad zurückgibt), also:

Code: [AUSKLAPPEN]
image:TImage = LoadImage(LocalizationManager.getLocalizedPath("Graphics/Menu/Logo.png"))


Ist ja keine große Sache, vllt. macht einer mal ein solch schönes Modul. Smile

PS: Die Buchstabenabkürzungen könnten ja aus der ISO 639-1 entnommen werden.
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

M0rgenstern

BeitragDo, Apr 26, 2012 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@ChaosCoder:
Die Dateien abhängig von der Lokalisierun zu laden wäre wirklich ziemlich cool. Wobei man das ja noch lange nicht für alle Bilder oder so braucht. Gut. Sounddateien dagegen wären dann schon interessanter.
Das mit den Arrays habe ich mir auch gedacht. Ja, man muss casten, zumindest wenn man es mit TMaps macht.
So habe ich es bei meiner Klasse gemacht (wens interessiert: https://www.blitzforum.de/foru...hp?t=38553). Aber das passiert alles nur intern in der Klasse, davon merkt man außerhalb nichts. Oder was genau meinst du?
Mal gucken, vielleicht baue ich das andere noch ein. Wäre schon ganz cool.
Was genau meinst du mit den Buchstabenabkürzungen?

Lg, M0rgenstern

ChaosCoder

BeitragDo, Apr 26, 2012 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit dem expliziten Casten meine ich das:
Code: [AUSKLAPPEN]
Local sArray3:String[] = ["100", String(iScore), String(iSpacePressed)]


ISO 639-1 definiert die Länderabkürzungen mit zwei Buchstaben, damit halt normiert ist, dass man das Verzeichnis für deutsch "de" und nicht etwa "ger" oder "deu" oder sowas nennt.
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

M0rgenstern

BeitragDo, Apr 26, 2012 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso.
Ja, du hast recht. Wenn man Zahlen ins Array stecken will, dann muss man sie schon casten (ich machs zumindest zur Sicherheit so).
Das mit den Akürzungen habe ich schon öfter gesehen. Wusste nur nicht, dass es so heißt.

Lg, M0rgenstern

ChaosCoder

BeitragDo, Apr 26, 2012 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier die Liste:
http://www.sil.org/iso639-3/co...p;letter=d

(Sortiert nach Anfangsbuchstaben) Wink
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

Noobody

BeitragDo, Apr 26, 2012 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
In BMax könnte man das vermutlich mit einem eigenen Protokoll lösen. BMax kennt ja einige Protokolle, die man vor Pfade hängen kann (z.B. "incbin::Resource.png", "http::Resource.zip", "zip::Resource.exe"). Ich weiss nicht, wie leicht sich das erweitern lässt, aber es sollte zumindest gehen. Dann kann man Spässe wie LoadImage("localized::Foobar.png") oder sowas betreiben.

Es muss ja nicht mal eine existierende Datei sein - der Protokollhandler muss einfach einen Stream produzieren. Dann kann man z.B. hinter den Kulissen Property-Files lesen und mit den LoadText-Methoden herumspielen - so à la LoadText("localized::menu.option.resolution").

Aber ohne Var-Arg Funktionen wird es schön haarig mit generischen Text-Attributen (sogenannte "string interpolation"). In ein paar Fällen könnte man mit Reflection über die Runden kommen, wenn man nur Type-Fields in den String setzt. z.B. TextInterpolate("Hello! I am $name and $age years old.", Self), wobei Self "name" und "age" als Field besitzt. Dann kann man per Reflection generisch die Parameter holen.
Ohne das wird es wohl oder übel daraus hinauslaufen, dass man TextInterpolate mit so 20 optionalen String-Parametern definiert, damit man komfortabel Parameter übergeben kann (dann fällt auch der explizite Cast weg). Ist aber auf jeden Fall ziemlich hässlich.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group