Jump to content
php.lv forumi

daudzvalodu atbalsts identiskam saturam


hmnc

Recommended Posts

Ja negribās čakarēties, apskaties google translate api.

Link to comment
Share on other sites

google translate nav nopietni. Kā piemērs - šodien pienākušais spams:

Sveiki dārgais,

Kā jums, un kā savu darbu cerību viss ir kustīgi naudas sodu. Mans vārds ir Marshard Dioh 21 gadus veca meitene Mani vaļasprieki ir lasīšana, mūzika, skatoties no filmas un atskaņošanai basketbolu. Man bija, kur i meklēt godīgs Lover un i atbilst jūsu profilam tas bija interesants un pievilcīgs tad i nokritās par zināt, kas tas bija, es vēlētos uzzināt vairāk par jums. ja Jums nav prātā, varat email mani, i būs ļoti priecīgs, lai izlasītu savu pastu ar visām baudu. tas būs iepazīties, kā arī lasīt no jums. lūdzu godu manu uzaicinājumu, lai mēs varētu apmainīties mūsu attēliem un varbūt kļūt mīļotājiem vai vairāk. Atcerieties, attālums nav nozīmes, kādiem jautājumiem ir mīlestība un ideju mēs dalīties ar otru.

Es gaidu dzirdēt no jums drīz. skūpsts,

Ar laba vēlējumiem,

Miss Marshard.

Link to comment
Share on other sites

Es laikam dzīvoju uz citas planētas, bet varbūt var priekš tādas lietas kā tulkojumiem neiespringt uz JOIN un to dabūšanas kopā ar produktiem ar vienu SQL un tiem uzrakstīt speciālu interfeisu, kas var tulkojumus turēt cache?

 

Es varu mierīgi tulkojumus ņemt no pavisam citām tabulām bez jebkādiem join:

$res = mysql_query('select * from products');
?>
<table>
<tr><th><?= lang('blah_col1_head') ?></th><th><?= lang('blah_col2_head') ?></th><th><?= lang('blah_col3_head') ?></th></tr>
<?php
while($row = mysql_fetch_assoc($res)){
    ?><tr><td>' . $row['col1'] . '</td><td>' . $row['col2'] . '</td><td>' . row['col3'] . '</td></tr><?
}
?></table>

 

Var jau būt, ka esmu pārpratis sākotnējo uzstādījumu un problēmu.

Link to comment
Share on other sites

Kaklz - piemēram ir produkcijas tabula - id, article_id, price, title, description, text

title, description un text - katrs savā valodā, bet id, article_id un price ir visiem identisks. katrs tulkojamais lauks atšķirās - nu kā jau normālā tekstā.

tevis ieteiktais pirmais variants ir labs pie neliela izmēra tabulām un, ja lauks, kurš jātulko tabulā ir viens - nav jāiespringst uz joiniem vai kādiem sarežģītiem kešošanas mehānismiem. pietam ņem vērā, ka datiem nav tupo inserts un select vienā tabulā, tur iet paralēlie joini vēl ar citām tabulām un dažādas sql darbības, kas strašna palēnina to visu pasākumu.

Link to comment
Share on other sites

Vēl variants, bet neņemos spriest cik tas racionāls:

id|item_id|lang|title|description|price|

lang norāda, kādā valodā ir informācija, atskaitot, unikālās vērtības: id,cena u.c

Piemērs:

1|1|lv|Sudraba tējkanna|Matēta tējkanna ar metāla pamatni|12.00

2|1|en|Silver teapot|Frosted teapot with metal pallet|12.00

 

SQL pieprasījums, tad būtu

SELECT * FROM table WHERE lang = ".$_SESSION['user_lang']."

Edited by phpjanis
Link to comment
Share on other sites

Vienkāršām lapām es parasti neglabāju datubāzē dažādus tabuliņu kolonu nosaukumus un līdzīgas lietas. Izmantoju kaut ko līdzīgu kā hmnc norādīja pirmajā variantā, vienīgi es nelietoju to tādā stilā: title_lv, title_en, title_ru, tā vietā es zimantoju mainīgos (kaut gan parasti masīva elementus), ar vienādiem nosaukumiem katrai valodai (caption_count, caption_price, caption_color, button_ok, button_cancel). Katrai valodai ir atbilstošais fails, piemēram, language_lv.php, kur ir sadefinēti valodas masīva elementi un, kas tiek includots atbilstoši izvēlētai valodai. Ar šo pieeju nav nekādu problēmu pievienot jaunu valodu, jāiztulko tikai viens fails.

 

Vēl vienai mājas lapai izmantoju xml, pēc pieredzes saku, labāk nevajag.

 

Neesmu nopietni pētījis gettext paplašinājumu, bet liekās ka to arī var izmantot lokalizācijas jautājumu risināšanā. Pielabojiet ja kļūdos.

Link to comment
Share on other sites

Vienkāršām lapām es parasti neglabāju datubāzē dažādus tabuliņu kolonu nosaukumus un līdzīgas lietas. Izmantoju kaut ko līdzīgu kā hmnc norādīja pirmajā variantā, vienīgi es nelietoju to tādā stilā: title_lv, title_en, title_ru, tā vietā es zimantoju mainīgos (kaut gan parasti masīva elementus), ar vienādiem nosaukumiem katrai valodai (caption_count, caption_price, caption_color, button_ok, button_cancel). Katrai valodai ir atbilstošais fails, piemēram, language_lv.php, kur ir sadefinēti valodas masīva elementi un, kas tiek includots atbilstoši izvēlētai valodai. Ar šo pieeju nav nekādu problēmu pievienot jaunu valodu, jāiztulko tikai viens fails.

 

Vēl vienai mājas lapai izmantoju xml, pēc pieredzes saku, labāk nevajag.

 

Neesmu nopietni pētījis gettext paplašinājumu, bet liekās ka to arī var izmantot lokalizācijas jautājumu risināšanā. Pielabojiet ja kļūdos.

Statiskam saturam tavs risinājums derēs ļoti labi, taču šajā gadījumā šķiet runa ir par dinamisku satura tulkojumu struktūru.

Link to comment
Share on other sites

Jā, ja ir nepieciešamība pēc dinamiska satura, tad nederēs. Man personīgi pagaidām nav sanācis tā ka tabuliņu kolon, pogu un tml. nosaukumiem tas būtu pilnībā nepieciešams. Arī šīs tēmas autors līdzīgu variantu apskatīja, tāpēc secināju ka šī pieeja varētu daudz maz noderēt. Vēl jau variants veidot iespēju valodu failus labot no admin paneļa pa tiešo, te protams mainīgo un masīvu pieeja nederēs, jāveido failam kāda sava struktūra, bet vienalga tas nav labākais variants dinamiskajam saturam, jo viss būs vienā čupā. Protams jau var mēģināt kaut ko atdalīt vai sakārtot, te jau jāskatās kādas ir prasības konkrētam projektam.

Edited by Maris-S
Link to comment
Share on other sites

Autoram, cik saprotu rupji runājot vajag web-veikalu. Jā, visus interfeisa knibuļus var lasīt iekšā ar gettext/failiem/utt, jo tie laika gaitā nemainās, bet ko darīt ar preču nosaukumiem aprakstiem utt? Lūk šīs problēmas risināšana, cik saprotu, tad arī autoru interesē. Neglabāt taču preču katalogu gettext failā ;)

Link to comment
Share on other sites

Aa nu tādas lietas kā produktu nosaukumus vai arī viņu aprakstus pilnīgi noteikti jāliek datubāzē, tur jau jāveido cms atbilstoši prasībām. Neesmu rūpīgi izpētījis visus datubāzes risinājumus kādi šeit tika piedāvāti, bet es personīgi jebkuram saturam, kas atrodas datubāzēs un ko jāatspoguļo vairākās valodās, lieku klāt lang_id koloniņu, vai arī pašu valodas kodu (lv, en, ru, kas valodu tabulā ir kā primary key). Valodām atsevišķa tabula. Cms cenšos taisīt, lai ievadīšanai vai labošanai valodu lauciņi tiek ģenerēti atbilstoši šai valodu tabulai, tad viegli pievienot valodu, vienkārši ievietojot jaunu ierakstu valodu tabulā, bišku ir sarežģītāk nekā veidot, piemēram, trīs kolonas, katru savai valodai. Nolasīšana arī notiek ņemot vērā izvēlēto valodu. Laba lieta valodas koloniņām taisīt indeksus, pie lielām tabulām selectiem būtu ātrāk jāstrādā, jo pārbaude notiks arī pēc valodas (tas protams ja, piemēram, netiek ņemts konkrēts produkts pēc identifikatora, bet ja nolasa produktu sarakstu konkrētai valodai).

Link to comment
Share on other sites

es tulkojumiem esmu paredzējis divas tabulas (tabulām ter_ ir tikai prefix) - languages un jf_content:

CREATE TABLE `ter_languages` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(100) COLLATE utf8_latvian_ci NOT NULL DEFAULT '',
 `friend_url` varchar(20) COLLATE utf8_latvian_ci DEFAULT NULL,
 `default` tinyint(1) NOT NULL DEFAULT '0',
 `published` tinyint(1) NOT NULL DEFAULT '0',
 `ordering` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3;

INSERT INTO `ter_languages` (`id`,`name`,`friend_url`,`default`,`published`,`ordering`) VALUES 
(1,'English','en',1,1,0),
(2,'Latvian','lv',0,1,0);

CREATE TABLE `ter_jf_content` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `language_id` int(11) NOT NULL DEFAULT '0',
 `reference_id` int(11) NOT NULL DEFAULT '0',
 `reference_table` varchar(100) COLLATE utf8_latvian_ci NOT NULL DEFAULT '',
 `reference_field` varchar(100) COLLATE utf8_latvian_ci NOT NULL DEFAULT '',
 `value` text COLLATE utf8_latvian_ci NOT NULL,
 `original_value` text COLLATE utf8_latvian_ci,
 `modified` datetime DEFAULT NULL,
 `modified_by` int(11) unsigned NOT NULL DEFAULT '0',
 `published` tinyint(1) unsigned NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`),
 KEY `search_index` (`language_id`,`reference_id`,`reference_table`,`reference_field`),
 KEY `reference_table_index` (`reference_table`)
) ENGINE=InnoDB AUTO_INCREMENT=4;

INSERT INTO `ter_jf_content` (`id`,`language_id`,`reference_id`,`reference_table`,`reference_field`,`value`,`original_value`,`modified`,`modified_by`,`published`) VALUES 
(1,2,1,'menu','name','Sākuma lapa','Home page','2009-07-07 10:30:21',1,1),
(2,2,1,'menu','friend_url','index','index','2009-07-07 10:30:21',1,1);

CREATE TABLE `ter_menu` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `type` varchar(25) DEFAULT 'm',
 `name` varchar(100) DEFAULT '',
 `friend_url` varchar(16) DEFAULT NULL,
 `description` text NOT NULL,
 `parent_id` int(10) NOT NULL DEFAULT '0',
 `component` varchar(250) NOT NULL DEFAULT 'self',
 `template` varchar(250) NOT NULL,
 `published` tinyint(1) NOT NULL DEFAULT '0',
 `modified` datetime DEFAULT NULL,
 `params` text NOT NULL,
 `ordering` int(11) DEFAULT '0',
 PRIMARY KEY (`id`),
 KEY `published` (`published`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;


INSERT INTO `ter_menu` (`id`,`type`,`name`,`friend_url`,`description`,`parent_id`,`component`,`template`,`published`,`modified`,`params`,`ordering`) VALUES 
(1,'m','Home page','index','some text',0,'self','',1,'2009-07-06 17:11:49','',0)

tabulu menu pievienoju kā paraugu, un te ir tikai viens ieraksts. Iztulkots ieraksts (tabulai menu) kolonnai `name` un `friend_url` glabājas tabulā jf_content kā divi ieraksti.

 

Kad padošu pieprasījumu "SELECT `id`, `name`, `friend_url` FROM `ter_menu`" savai uzrakstītai klasei, un ja būs iesetota latviešu valoda šai klasei, tad automātiski tiks aizvietoti `name` un `friend_url` ieraksti no tabulas `ter_jf_content` (ja tādi tur vispār būs protams).

šeit es mēģīnāju pirms gada paskaidrot http://php.lv/f/topic/5848-valodas/page__p__92042entry92042

 

Priekšrocības:

  • salikt cik vien vēlamies tulkojamo valodu - tikai pievienojot tabulā `ter_languages`
  • var iztulkot visu dadubāzi
  • nav vajadzības pārrakstīt pieprasījumus

Mīnusi:

  • saturam jābūt identiskam visās valodās - ja ir sadaļa EN versijā, tad jābūt arī LV versijā. Protams var ar perversijām, bet vēlams izmantot tikai tulkošanai
  • Pie pieprasījuma tulkošanas tiek izsaukts papildus pieprasījums pēc tulkojumiem. Ar to var cīnīties kešojot pieprasījumus
  • tulkošana strādā tikai uz SELECT, bet ar to es domāju pietiek

es jau tagad visu glabāju datubāzē, un varu jebkurai savai lapai pievienot cik vien vēlos valodas un tulkota satura (bez jebkādiem sarežģījumiem). Ir arī uzrakstīts Adminpanelis, kur ar vienu konfigurācijas failu norādu, no kuras tabulas kādi lauki ir jāiztulko. Tad ērtā interfeisā to var darīt.

Tieši tā pat, kā tas notiek http://www.joomfish.net/

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...