multiple languages

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

multiple languages

Δημοσίευση από ksamole » 28 Δεκ 2008 07:36

Σε ενα site θέλω να εχω πολλες γλωσσες και εχω κανει το εξης:

languages(langID,title)

categories(categoryID,parentID)

categories_lang(categoryID,langID,title)

με foreign keys και κανω joins

το θεμα ειναι οτι θελω το περιεχομενο να ειναι συγχρονισμενο σε όλες τις γλωσσες
και αμα δεν υπαρχει κατι σε καποια γλωσσα να το δειχνει σε καποια που υπαρχει εχει κανεις
καμια ιδεα καλή πως να το κανω αυτο ?

και μια αλλη ιδεα που μου ηρθε ειναι να εχω

languages(langID,title)

categories(categoryID,parentID,title) -> εδω το πεδιο title ειναι η default language και την
δειχνουμε μονο αμα δεν υπαρχει σε καποια γλωσσα το περιεχομενο

categories_lang(categoryID,langID,title)

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

multiple languages

Δημοσίευση από cherouvim » 28 Δεκ 2008 09:53

ksamole έγραψε:categories(categoryID,parentID,title) -> εδω το πεδιο title ειναι η default language και την
δειχνουμε μονο αμα δεν υπαρχει σε καποια γλωσσα το περιεχομενο

categories_lang(categoryID,langID,title)
Μη κάνεις το παραπάνω γιατί έτσι θα συντηρείς διπλά table schemas.
Μπορείς να προσθέσεις ένα order ή weight field στο languages. Το πρώτο ή αυτό με τη μεγαλύτερη βαρύτητα είναι το default. Έτσι ξέρεις και με πια σειρά να εκτυπώσεις τις γλώσσες στο UI.

Κώδικας: Επιλογή όλων

languages (id, title, `order`)
categories (id, parent_id)
categories_i18n (category_id, language_id, title)

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

multiple languages

Δημοσίευση από ksamole » 28 Δεκ 2008 10:11

ναι αλλα ετσι υπαρχει αλλο προβλημα......

κανω το 1ο query και ας πουμε δε βρεθει περιεχομενο σε αυτη τη γλωσσα μετα
πρεπει να κανω και 2ο query με αλλο langID και αν παλι δε βρεθει αλλο query κτλπ.
Αυτο πως θα το λυσω ?

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

multiple languages

Δημοσίευση από cherouvim » 28 Δεκ 2008 10:31

Οι λύσεις είναι πολλές.

Αν έχεις λίγες γλώσσες (ας πούμε 5 στον αριθμό) μπορείς να φέρνεις όλη τη πληροφορία για ένα category id. πχ:

Κώδικας: Επιλογή όλων

select * from categories c, categories_i18n ci, languages l where
c.id=ci.category_id and
l.id=ci.language_id and
c.key='cars' /* psahnoume gia category 'cars' */
order by l.`order`;

+----+-----------+------+-------------+-------------+------------+----+---------+-------+
| id | parent_id | key  | category_id | language_id | title      | id | title   | order |
+----+-----------+------+-------------+-------------+------------+----+---------+-------+
|  1 |      NULL | cars |           1 |           2 | Autokinita |  2 | Greek   |     1 |
|  1 |      NULL | cars |           1 |           1 | Cars       |  1 | English |     2 |
+----+-----------+------+-------------+-------------+------------+----+---------+-------+
Αν ξέρεις πια είναι η default μπορείς να ζητάς με το id αυτής που ψάχνεις μαζί με της default και να πάρεις το πρώτο αποτέλεσμα μόνο. Στο παράδειγμα αν δεν υπήρχε μετάφραση για το language 1 (Αγγλικά), θα πέρναμε το 2 (Ελληνικά)

Κώδικας: Επιλογή όλων

select * from categories c, categories_i18n ci, languages l where
c.id=ci.category_id and
l.id=ci.language_id and
c.key='cars' and
l.id in (1, 2) /* 1=english, 2=greek (default) */
limit 1;
Το languages table είναι ότι πρέπει για να το cachάρεις κάπου.

υ.γ πρόσθεσα και το field key (unique) στο categories για να έχεις τη κατηγορία και σε απλό λατινικό κείμενο για χρήση σε URLs κτλ.

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

multiple languages

Δημοσίευση από ksamole » 28 Δεκ 2008 13:00

το θεμα ειναι οτι περνω το langID απο GET και φτιαχνω το query βαση αυτού.

αν δεν βαλω το langID στο query πως θα ξερω ποια γλωσσα ζητησε ο χρηστης ?

Αν παρω ολες τις γλωσσες μετα πως θα εμφανισω αυτη τη γλωσσα που ζητησε ο χρηστης ?

Εγω θελω να εμφανιζει τη γλωσσα που ζητησε ο χρηστης και μονο αν δεν υπαρχει αυτη
η γλωσσα να εμφανιζει καποια αλλη με βαση καποιο ordering......

Το προβλημα ειναι πως θα κάνω to query να επιστρεφει 1 γλωσσα αυτη συγκεκριμενα που ζητηθηκε και αν δεν υπαρχει αυτη να επιστεφει καποια αλλη,,

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

multiple languages

Δημοσίευση από fafos » 28 Δεκ 2008 15:26

Prosthese allo ena pedio p.x. default_phrase... ekei tha grafeis thn frash-leksh pou thes na emfanizete efoson den thn vrei se kapoia glossa..

Me thn domh pou xrhsimopoieis isos dyskoleuteis se kapoia pragmata... epishs mporeis na xrhsimopoieis mia function opou mporeis na vlepeis poiew fraseis-lekseis den exoun metafrastei..

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

multiple languages

Δημοσίευση από ksamole » 29 Δεκ 2008 07:35

Δηλαδη υπαρχει ποιο ευκολη δομη απο αυτη ?

Μπορεις σε παρακαλω να μου πεις πως μπορω να το κανω ποιο απλα ?

και κατι αλλο ..

τα constant strings του site σε τι μορφη μπορω να τα αποθηκευω ?

σε xml ισως ? (αργοτερα θελω να μεταφερω το site μου σε java οταν παρω static ip και βαλω δικο μου server)

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

multiple languages

Δημοσίευση από cherouvim » 29 Δεκ 2008 10:43

Το πρόβλημα είναι εξορισμού δύσκολο. Αν το λύσεις με απλοϊκό τρόπο θα έχεις γρήγορα αποτελέσματα αλλά ενδέχεται να το βρεις μπροστά σου αργότερα.

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

multiple languages

Δημοσίευση από ksamole » 29 Δεκ 2008 11:14

ισως ομως αυτο το προβλημα πρεπει να το αναλαβει η βαση με καποια stored procedures ?

και να μην το ριξω στην php με 2πλα 3πλα queries ?

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

multiple languages

Δημοσίευση από cherouvim » 29 Δεκ 2008 11:23

Μην παίξεις με stored procedures για αυτή τη δουλειά. Θα μεταφέρεις λογική στη βάση και θα κάνεις πολύπλοκο το όλο σύστημα χωρίς λόγο.

Στη δομή που σου έδωσα πριν αν ξέρεις οτι ο χρήστης κάνει browsing στα Αγγλικά και η default γλώσσα είναι τα Ελληνικά τότε το query που θες είναι αυτό που σου έδωσα πιο πριν:

Κώδικας: Επιλογή όλων

select * from categories c, categories_i18n ci, languages l where
c.id=ci.category_id and
l.id=ci.language_id and
c.key='cars' and
l.id in (1, 2) /* 1=english, 2=greek (default) */
limit 1;
Έτσι θα πάρεις το Αγγλικό translation αν υπάρχει, αλλιώς το Ελληνικό.

Αν έχεις cachάρει το languages table και θες να αποφύγεις το join σε 3 πίνακες κάντο έτσι:

Κώδικας: Επιλογή όλων

select * from categories c, categories_i18n ci where
c.id=ci.category_id and
c.key='cars' and
ci.language_id in (1, 2) /* 1=english, 2=greek (default) */
limit 1;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

multiple languages

Δημοσίευση από dva_dev » 29 Δεκ 2008 14:52

Αν η mysql υποστηρίζει subqueries μπορείς να κάνεις το εξής:
Να ψάξεις πρώτα για τη γλώσσα που θέλεις δίνοντας προτεραιότητα 0.
Να ψάξεις μετά για ότι υπάρχει διαθέσιμο σε οποιαδήποτε γλώσσα, κρατώντας την προτεραιότητα της γλώσσας όπως προτείνει και ο cherouvim.
Αυτά τα 2 τα φέρνεις σε ένα union και παίρνεις μόνο την πρώτη εγγραφή (με order by προτεραιότητα αν θέλεις).

Συνοπτικά δοκίμασε το εξής (το πεδίο για την προτεραιότητα της γλώσσας απέφυγα να το βάλω order για να μην γίνεται μπέρδεμα, αλλά priority, όπως και το .

Κώδικας: Επιλογή όλων

/*
parameters:
    'cars' for categories.`key` 
    3 for languages.`id`

    could use languages.`title` instead but languages.`id` is faster
*/

select `key`, `title`
from
(
	select categories.`key`,  categories_lang.`title`, 0 `priority`
	from
		categories inner join categories_lang on (categories.`id` = categories_lang.`categoryid`)
		inner join languages on (categories_lang.`langid` = languages.`id`)
	where
		categories.`key` = 'cars' and languages.`id` = 3

	union

	select categories.`key`,  categories_lang.`title`, languages.`priority`
	from
		categories inner join categories_lang on (categories.`id` = categories_lang.`categoryid`)
		inner join languages on (categories_lang.`langid` = languages.`id`)
	where
		categories.`key` = 'cars' and languages.`id` <> 3
&#41; tmp
limit 1
Αν θέλεις κάτι πιο σύνθετο, ακριβώς πριν το limit βάζεις και ένα order by `priority` + όποια άλλα πεδία έχεις για την ταξινόμηση.

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

multiple languages

Δημοσίευση από fafos » 29 Δεκ 2008 15:41

Den gnorizo an yparxei poio aplos tropos alla pisteuo oti tha synanthseis provlhmata me ton tropo pou prospatheis na to feiakseis (p.x. eisagogh neas glossas)..

Ego xrhsimopoio ena tropo o opoios einai prosarmosmenos pano sthn templates engine smarty..

To skeptiko einai na mporei o pelaths na kanei eisaagogh neas glossas me mia forma sthn diaxeirish..

Xrhsimopoio 3 pinakes:

1. Langs-> id, name, iso (p.x.: 1, Greek, UTF-8 )

2. Categories-> id, name (p.x.: 1, contact form)

3. Phrases-> id, text, category, varname, default_phrase, lang_id

p.x.: 1, Hello Word, 1, hello.word, Hello Word, 1


Sthn diaxeirish exo ena magiko koumpaki pou patontas to metatrepei oles tis fraseis pou periexei h kyria glossa (p.x. English) se array kai ola ayta ta sozo se ena arxeio php..

Auto to arxeio to xrhsimopoio gia na dhmiourgo nees glosses.. sthn diaxeirish exo mia forma dhmiourgias neas glossas opou dino ta stoixeia (name kai iso) kai me to submit "arpazei" thn array kai dhmiourgei nea pedia mesa ston pinaka Phrases me keno to text gia na ksero poies fraseis exo metafrasei kai poies oxi.

Katopin pao se mia forma opou epilego poia glossa thelo na kano metafrash symplhronontas ta kena text... etsi ksero poies fraseis exo metafrasei h oxi kai prato analoga..

Epishs exo allh mia forma gia thn default glossa gia prosthesh neon phraseon-lekseon.. me kathe nea eisagogh phrashs-lekshs sthn default dhmiourgei automata nea pedia kai gia tis ypoloipes glosses eno ananeonei kai to arxeio me thn array..

Gia Oses phraseis-lekseis den exo metafrasei xrhsimopoiei thn default_phrase kai katharisa..

Epishs me to pou mpaino sthn diaxeirish glossas vlepo poses phraseis-lekseis den exoun metafrastei apo kapoies glosses (p.x. Den exoun metafrastei 12 phraseis apo thn Ellhnikh glossa - Pathste edo gia na tis metafrasete)

To varname ston pinaka Phrases to xrhsimopoio gia to smarty, esena mporei na mhn sou xreiazete...

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

multiple languages

Δημοσίευση από dva_dev » 29 Δεκ 2008 16:19

Αυτό που προσπαθεί να κάνει δεν είναι πολύ διαφορετικό από αυτό που έχεις κάνει, μόνο που τα πάντα αποθηκεύονται στη database.

Για να προστεθεί μια νέα γλώσσα, αρκεί να μπεί η εγγραφή της γλώσσας στον πίνακα languages, και μετά για αυτή τη γλώσσα να περαστούν τα μεταφρασμένα strings στον πίνακα categories_lang.

Οποιο string δεν υπάρχει στη συγκεκριμένη γλώσσα, δεν θα ψάξει απλώς να το βρεί στην default γλώσσα, αλλά σε οποιαδήποτε υπάρχουσα. Η σειρά αναζήτησης θα γίνει ανάλογα με την προτεραιότητα που έχει οριστεί για τις γλώσσες.
Ουσιαστικά είναι ένα πιο ευέλικτο σχήμα γιατί δεν σε περιορίζει να έχεις μία default γλώσσα.

[edit]
Μπορούν να αναλάβουν 5 διαφορετικά άτομα να κάνουν τις μεταφράσεις με ότι γνωρίζει ο καθένας.
Να βάλει ο πρώτος 3 κατηγορίες στα ελληνικα, να βάλει ο 2ος άλλες 5 στα κινέζικα, ο 3ος άλλες 2 στα γερμανικά, ο 4ος άλλες 5 στα ρουμάνικα και ο 5ος 10 τυχαίες στα αγγλικά.
Οταν κάνεις αναζήτηση μπορείς να έχεις συνολικά 20 διαφορετικές κατηγορίες σε όλες τις γλώσσες, αλλά σε καμία γλώσσα δεν υπάρχει πλήρης μετάφραση. Σε μια τέτοια περίπτωση δεν μπορεί να δουλέψει το σχήμα της 'default γλώσσας' αλλά το παραπάνω σχήμα δουλεύει γιατί ψάχνει σε όλες τις γλώσσες και σε όποια το βρεί πρώτο το επιστρέφει.

Επιπλέον καθώς συμπληρώνονται οι μεταφράσεις σιγά σιγά, μπορείς αλλάζοντας μόνο την προτεραιότητα δυναμικά στον πίνακα γλωσσών να δείχνεις στους χρήστες σου διαφορετική default γλώσσα σε περίπτωση που κάτι δεν βρεθεί στη γλώσσα που ψάχνεις.
[/edit]

ksamole
Δημοσιεύσεις: 92
Εγγραφή: 08 Οκτ 2006 04:43

multiple languages

Δημοσίευση από ksamole » 29 Δεκ 2008 18:45

Σας ευχαριστω όλους!!!!!!!!!

και κατι αλλο..

@dva_dev το query που μου εδωσες δουλευει αψογα αλλα μηπως ειναι εφικτο να το μικρανεις
λιγο για να βγαζω ακρη γιατι ετσι που ειναι ντουβαρι και χανομαι αν δεν γινετε παλι θα το χρησιμοποιησω ετσι παντος μπραβο πολυ καλη δουλεια!!!

επισης τα constant strings του site τι ειναι καλυτερα να τα εχω σε καποιο xml/php αρχειο η σε ενα table στη βαση ?

Άβαταρ μέλους
alexandr0s
Δημοσιεύσεις: 1064
Εγγραφή: 25 Απρ 2006 17:16
Τοποθεσία: localhost
Επικοινωνία:

multiple languages

Δημοσίευση από alexandr0s » 30 Δεκ 2008 18:09

ksamole έγραψε: επισης τα constant strings του site τι ειναι καλυτερα να τα εχω σε καποιο xml/php αρχειο η σε ενα table στη βαση ?
Αν τα έχεις σε ένα php αρχείο είναι ο quick and dirty τρόπος (προσωπικά έτσι τα έχω). Αν φτιάξεις ένα interface που θα διαβάζει-γράφει το αρχείο ακόμα καλύτερα.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 3 επισκέπτες