Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%)
|
Cze!
Przewertowałem wujaszka google i nadal nie wiem które rozwiązanie wybrać. Tagi 1 Dodatkowa kolumna 'tags' nie spełniająca warunku normalności. Pojedyncze tagi rozdzielone przecinkiem albo średnikiem i wszystkie zapisane w jednym polu. 2 Dodatkowo tabela z kolumnami id, tag. Taka tabela tez nie jest normalna bo jeśli jeden id ma kilka tagów to id musi się powtarzać w następnych wierszach. Jak widać ani jedno ani drugie rozwiązanie nie jest idealne. Pierwsze jest prostsze w realizacji. Drugie minimalnie trudniejsze, ale czy lepsze? Można to drugie zmodyfikować dodając dodatkową tabelę łączącą id, tag_id, a w tabeli tags trzymać tag_id i tag. Ale ideologia pozostaje ta sama. Które rozwiązanie się sprawuje lepiej? Bo oba są złe - powtórzenia w poziomie albo w pionie. Tłumaczenia A dokładniej statyczne tłumaczenia. Czy lepiej tłumaczyć fragmenty stron, te które się zmieniają w różnych językach, czy lepiej całe strony? 1 Jak tłumacze całe strony, to minusem jest konieczność pamiętania o aktualizacji obu stron. Bo jak zmienię jedna stronę to druga działa bez problemów ale jest nieaktualna. 2 Jak tłumacze tylko fragmenty, to przy każdym fragmencie tekstu, czy to paragraf, czy podpis pod zdjęciem, czy element menu muszę użyć jakiejś funkcji, która z bazy pobierze tekst w odpowiednim języku. Czyli kod strony się robi bardziej nieczytelny i liczba selectów z bazy wzrasta. Poradzicie coś w tych dwóch tematach? A może coś z zupełnie innej beczki |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
TAGI
tabela news ID blabla tabela tagi ID TAG tabela wiąząca news_tag ID_NEWS ID_TAG jest to dosc powszechnie stosowane. Mozesz na tym zrobic wszystko co chcesz (IMG:style_emoticons/default/smile.gif) |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%)
|
Ja ostatnio robiłem statyczną stronę dla klienta, i wymyślił sobie że chce dodatkowy język, to mu zrobiłem, nowy folder i kopiuj wklej pliki (^^), ale co ładny adres pozostał, strona/en/contact.html (IMG:style_emoticons/default/winksmiley.jpg)
I miałem banie czy robić 2 sitemapa, pod ten folder, ale darowałem sobie ;] Lepiej będzie jak mu dwie strony zindeksuje google (IMG:style_emoticons/default/haha.gif) |
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 561 Pomógł: 72 Dołączył: 15.11.2006 Ostrzeżenie: (0%)
|
Możesz wszystkie tłumaczone teksty wybrać tak naprawdę tylko jednym selectem. Wiąże się to z użyciem boforowanego wyjścia (ob_start(), ob_end_flush()). Podczas wykonywania skryptu zapisujesz sobie wszystkie użycia tekstów, które powinny być tłumaczone. Po wyrenderowaniu całości do bufora wybierasz selectem użyte teksty i zamieniasz funkcją podaną jako callback w ob_start() wystąpienia szukanych tekstów na te wybrane z bazy danych w zależności od języka wybranego przez użytkownika (IMG:style_emoticons/default/smile.gif)
|
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%)
|
nospor ale wtedy tabela nie jest normalna. Czy nie ma lepszych rozwiązań?
krowal możesz to jakoś bardziej wyjaśnić? |
|
|
|
Post
#6
|
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%)
|
@nowy_pechapowiec:
to jest normalna tabelka (pomijam brak definicji tego wyrazenia (IMG:style_emoticons/default/smile.gif) ). I jakie chcesz lepsze rozwiazanie. Bo jak chcesz tylko wyswietlac artykul i jego tagi to wystarczy ci zapisac je w jednym polu po przecinku. Jak chcesz czegos wiecej to zrob jak proponowal nospor, to rozwiazanie jest w dodatku ZNORMALIZOWANE. Jak chcesz tag cloud szybko rysowac to zapewne przyda ci sie licznik tagow zapisany w tabeli z tagami (uwaga!!! to ci zdenormalizuje baze, straszne, co?: )) |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%)
|
nospor, dr_bonzo to rozwiązanie z 3 tabelami jest popularne i działa. Ale nie mówcie, że taka baza jest znormalizowana, bo nie jest. To znaczy spełnia jedynie warunki pierwszej postaci normalnej. I powiem wprost irytują mnie powtórzenia w tabelach (kilka tagów => powtarzam wiersze z tym samym ID). Zastanawiam się jak to zrobić lepiej. Na pewno już ktoś to dawno wymyślił, tylko ja o tym jeszcze nie wiem. Może jednak Wy coś na ten temat wiecie? (IMG:style_emoticons/default/smile.gif)
krowal poczytałem troszkę o ob_start() iob_end_flush() i wydaje mi się, że te funkcje pozwalają na przetworzenie jakimś zestawem funkcji strony przed jej wysłaniem do przeglądarki. Ale to nadal nie do końca jarzę jaki miałbym z niej pożytek? Wywołać str_replace() a obie tablice (co zamienić, na co zamienić) trzymać w bazie i pobrać je w całości? Jeśli tak to, to owszem jest to wygodne ale mało wydajne. Bo jak mam podstronę na której jest do zamiany np. 10 słów a na innej 70 słów, to za każdym razem muszę pobrać z bazy cały słownik. I kolejny minus, trzy teksty: "She goes crazy", "He goes crazy", "crazy". W zależności od kolejności słów w tablicach albo się uda sensownie zamiana albo się wszystko porypie. Żeby się nie rypało to musiałbym przy każdym tekście mieć osobną zamianę: lantrans("She goes crazy") . lantrans("He goes crazy") . lantrans("crazy") a funkcja lantrans() selectuje z bazy odpowiedni string. No ale jak widac mało to wygodne i kod się robi ...... przeczytałem jeszcze raz ten spory temacik o tłumaczeniach ale akurat tego problema w nim nikt nie porusza. pozdro |
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 561 Pomógł: 72 Dołączył: 15.11.2006 Ostrzeżenie: (0%)
|
Po pierwsze schemat tabeli z tlumaczeniami, mniej więcej może być taki:
id, key, lang_en, lang_fr, lang_pl, ... (w zaleznosci od ilosci jezykow) Po drugie funkcja langtrans('key') ('key' - odpowiednik unikalnego klucza w tabeli) nie robi zapytania do bazy tylko zapisuje klucze do jednej tablicy. A to przykładowy przebieg wydarzeń:
Trochę chaotycznie, ale może załapiesz (IMG:style_emoticons/default/smile.gif) |
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%)
|
krowal no nie jarzę. wstyd się przyznać ale nie jarzę
Mam mieć w kodzie strony coś takiego? ob_start('funkcjaTlumaczaca'); echo 'a,fnsd,f dskfndskfds dskfdskf' . langtrans('key1') . 'dfvdgvdf fdvfdvdf fdvd dfgvfd' . langtrans('key2') . 'dsfdsfdsfdsfds'; ob_flush(); funkcja langtrans('key') ma zapisywać gdzieś słowa do tłumaczenia i tylko one maja być pobrane przez funkcjaTlumaczaca()? I ta funkcjaTlumaczaca() ma dokonać zamiany? Ale co jeśli wystąpią dwa słowa "painfully" i "full"? To faktycznie jest o tyle lepsze, że nie trzeba wielu selectów tylko jeden. No ale jak uniknąć pomyłek? Nie, chyba ja jednak zupełnie się w tym nie połapałem. pozdro |
|
|
|
Post
#10
|
|
|
Grupa: Zarejestrowani Postów: 561 Pomógł: 72 Dołączył: 15.11.2006 Ostrzeżenie: (0%)
|
Nie rozumiem o co Ci chodzi, dwa słowa to dwa oddzielne klucze w bazie i dwa oddzielne tlumaczenia tych słów. langtrans('painfully').langtrans('full') powinny zapisać w tablicy dwa klucze za pomocą których wyciągniesz potem ich tłumaczenia odpowiednie dla wybranego języka.
|
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 403 Pomógł: 68 Dołączył: 20.03.2008 Ostrzeżenie: (0%)
|
@nowy_pehapowiec
to co nospor napisał jest jak najbardziej znormalizowane, popatrz content id|tresc 1|to jest pierwsza treść 2|to jest druga treść 1|to jest trzecia treść tagi id|tag 1|php 2|mysql 3|ajax content_tagi id_content|id_tag 1 |2 1 |1 2 |1 jak widzisz tabela łącząca nigdy nie ma takiej samej pary content - tag a przynajmniej nie powinna mieć przy dobrym zapisaniu skryptu. znormalizowana baza powinna spełniać takie wymagania: 1. wiersze są unikalne, tzn w żadnej tabeli nie może się zdarzyć, ze któryś wiersz się powtarza 2. kolumny są unikalne 3. pola są atomowe, tzn ze w każdym polu są dane, których nie da się (nie ma potrzeby) dzielić na mniejsze Jak widzisz jest to znormalizowana baza danych |
|
|
|
Post
#12
|
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%)
|
krowal ale jeśli jedna fraza zawiera się w drugiej? to jeśli "full" będzie zamieniany przed "painfully" to z "painfully" zrobi się painpełnyy. Rozumiesz o co mi chodzi? Albo ja zupełnie nie skumałem tego co mi napisałeś. Może mógłbyś wstawić tutaj przykładowy ale kompletny kod strony i kody funkcji, zapytań do bazy. Wtedy by się wyjaśniło co i jak.
W ogóle bardzo mnie mechanizmy tłumaczenia stron interesują, przecież musi być jakiś dobry na to pomysł. f1xer Cytat content_tagi id_content|id_tag 1 |2 1 |1 2 |1 to jest zgodne tylko z pierwszą postacią normalną, ale z kolejnymi już nie. Bo masz id_content powtórzone dwa razy to samo (1). Ale mniejsza o to, też tak zrobiłem, bo nic lepszego nie wymyśliłem. Pozdrawiam |
|
|
|
Post
#13
|
|
|
Grupa: Zarejestrowani Postów: 403 Pomógł: 68 Dołączył: 20.03.2008 Ostrzeżenie: (0%)
|
NIE MOŻE POWTARZAĆ SIĘ WIERSZ a nie pole, gdyby tak było to nie można byłoby tworzyć relacji wiele do wielu
|
|
|
|
Post
#14
|
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 0 Dołączył: 24.08.2009 Ostrzeżenie: (0%)
|
Ponawiam pytanko:
krowal ale jeśli jedna fraza zawiera się w drugiej? to jeśli "full" będzie zamieniany przed "painfully" to z "painfully" zrobi się painpełnyy. Rozumiesz o co mi chodzi? Albo ja zupełnie nie skumałem tego co mi napisałeś. Może mógłbyś wstawić tutaj przykładowy ale kompletny kod strony i kody funkcji, zapytań do bazy. Wtedy by się wyjaśniło co i jak. |
|
|
|
Post
#15
|
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%)
|
Cytat nospor, dr_bonzo to rozwiązanie z 3 tabelami jest popularne i działa. Ale nie mówcie, że taka baza jest znormalizowana, bo nie jest. To znaczy spełnia jedynie warunki pierwszej postaci normalnej. I powiem wprost irytują mnie powtórzenia w tabelach (kilka tagów => powtarzam wiersze z tym samym ID). Zastanawiam się jak to zrobić lepiej. Na pewno już ktoś to dawno wymyślił, tylko ja o tym jeszcze nie wiem. Może jednak Wy coś na ten temat wiecie? Łojeb. To moje studia, i kilka ksiazek o bazach ktore przerobilem mnie klamaly? Caly czas mowily ze to jest znormalizowana baza, i tak sie robi relacje wiele do wielu. Cytat I powiem wprost irytują mnie powtórzenia w tabelach Czlowieku, obudz sie, zyjesz w swiecie gdzie nie ma rzeczy idealnych, mozesz sobie usunac powtorzenia, ale system tagow bedzie ci mulil, i co powiesz klientowi? "No niestety tak musi byc bo nie lubie powtorzen w bazie" ? Cytat content_tagi id_content|id_tag 1 |2 1 |1 2 |1 to jest zgodne tylko z pierwszą postacią normalną, ale z kolejnymi już nie. Bo masz id_content powtórzone dwa razy to samo (1). Ale mniejsza o to, też tak zrobiłem, bo nic lepszego nie wymyśliłem. No chyba cie pogielo. To jest jak najbardziej prawidlowe rozwiazanie, dla relacji wiele do wielu. Przeciez jeden CONTENT ma miec WIELE tagow, temu sie powtarza w tej tabeli, dopisz sobie jeszcze Kod 2| 2 i ... o matko, id_tag sie powtarza. I to tez jest ok, bo kazdy tag moze byc przypisany do wielu contentow.Polecam wrocic do podstaw projektowania baz danych. ============ Zamiana tresci, slowo po slowie jest BEZSENSU. Jezyk, np. angielski, nie przeklada sie na polski co do slowa. Prawie zawsze to samo zdanie buduje sie inaczej, i nie wystarczy przetlumaczyc slow zeby bylo dobrze. Changing content, word by word is pointless. Language, for example english, no translate itself on polish what to word. Almost always that same sentence builds itself other way, and no enough to translate words to is good. Cytat Jak tłumacze całe strony, to minusem jest konieczność pamiętania o aktualizacji obu stron. Bo jak zmienię jedna stronę to druga działa bez problemów ale jest nieaktualna. To zes problem znalazl. Po prostu MUSISZ strone w innym jezyku przetlumaczyc i kropka. Najlepiej w calosci. |
|
|
|
Post
#16
|
|
|
Grupa: Zarejestrowani Postów: 561 Pomógł: 72 Dołączył: 15.11.2006 Ostrzeżenie: (0%)
|
Ech nie chciało mi się tłumaczyć więc napisałem dla Ciebie działający kod (IMG:style_emoticons/default/smile.gif)
Dostępne są takie języki jakie są pola w bazie, w tym przypadku en i pl. Języki można zmienić wywołując skrypt z parametrem ?lang=xx , gdzie xx = (en,pl). Skrypt wykonuje tylko jedno zapytanie do bazy wybierając tłumaczenia. Oprócz tego jeśli wprowadzisz nowe klucze do tekstu za pomocą funkcji __(klucz) to dla każdego klucza zostanie JEDNORAZOWO wykonane zapytanie wstawiające klucz do tabeli. Btw. to tylko przykład... aby działało to z jakąś większą aplikacją potrzebne są małe modyfikacje (IMG:style_emoticons/default/smile.gif) Miłego korzystania. @dr_bonzo, masz rację że tłumaczenie stron słowo po słowie jest bez sensu, ten kod również na to nie pozwala, pozwala jednak na tłumaczenie słów statycznych na stronie, dynamiczny content generowany przez userów to już inna sprawa. Skrypt pozwala na internacjonalizację strony a nie jej lokalizację. Ten post edytował krowal 1.09.2009, 15:42:43 |
|
|
|
![]() ![]() |
|
Aktualny czas: 21.12.2025 - 23:32 |