Modus Internet : Located in Vancouver and Burnaby British Columbia we do website design, database integration, custom programming, search engine optimization (SEO) or consultation.

v0.5 Setup and Install Instructions

Release Overview

(Release Date: Nov 23, 2014)

This product does not come with an automated setup script or admin system yet but if the user is able to follow instructions, access a DB client like phpMyAdmin and update a config file, they should be fine. However, this verions does come with a new /setup.php configuration test script. It doesn't do anything automatically for you but it will check on the environmental conditions of your server and the progress of your setup.

Installations of Custodian CMS (CCMS) prior to this release should be updated in order to add the all new bidirectional (BIDI) features which are needed to help support website content which needes to be displayed from right-to-left. Read this artical from the W3C titled Script direction and languages for more information and insights.

Updates in this release:

  • Rebuilt /index.php to test for new /setup.php template. Used to help new sites quickly diagnose server environment and confirm that all resources are in place and functioning as required.
  • Major overhaul to core parsing engine to enable the addition and use of bidirectional (BIDI) information associated with each language supported by a users website.
  • Addition of two new columns, dir and ptrLng, in the ccms_lng_charset table.
    • dir = Direction of characters, ltr or rtl.
    • ptrLng = Pointer to a different language code ie: en-ca and en-us both point to just en.
  • Addition of 8 new columns referring to language codes in the ccms_ins_db table to help demonstrate the example templates. Note: In order to user Custodian CMS properly you do not need all of these languages, the only requirement is that you have at least 1 language marked as 'default' in the system. It doesn't even need to contain any content.
  • Renamed function CCMS_insDBPreload() to CCMS_DB_Preload().
  • Renamed array $CLEAN["CCMS_insDBPreloadContent"] to $CLEAN["CCMS_DB_Preload_Content"].
  • Renamed function CCMS_insDB() to CCMS_DB().
  • Renamed function CCMS_insDB_dir() to CCMS_DB_Dir().
  • Added Arabic and Hebrew to some example templates to help demonstrate BIDI functionality and use.
  • Renamed function CCMS_dbFirstconnect() to CCMS_DB_First_Connect().
  • Renamed function CCMS_filter() to CCMS_Filter().
  • Renamed function USER_filter() to CCMS_User_Filter().
  • Renamed function CCMS_go() to CCMS_Main().
  • Renamed function CCMS_insTPL() to CCMS_TPL_Insert().
  • Renamed function CCMS_tplParser() to CCMS_TPL_Parser().
  • Renamed function CCMS_setLng() to CCMS_Set_LNG().
  • Completely removed deprecated function CCMS_setContentTypeHeader().
  • Completely removed deprecated function CCMS_sqlQueryFailure().
  • Recoded multiple areas throughout the newly renamed CCMS_Set_LNG() function to remove all database calls and tighten code up over all.
  • Recoded newly renamed CCMS_DB_First_Connect() function to capture and store information from the ccms_lng_charset table in the database regarding language settings for later use.
  • Updated regular expression for cookies to allow for spaces. (Not sure how I missed that before.)


  1. Download the release files, from GitHub or locally, to your computer and decompress.
    NOTE: Tools like curl, libwww and wget do not work on to download files.
  2. Import the contents of the /ccms-db-setup.sql file or copy the SQL statement below, into MySQL to populate your database.
    SET time_zone = "+00:00";
    /*!40101 SET NAMES utf8 */;
    -- Table structure for table `ccms_ins_db`
    CREATE TABLE IF NOT EXISTS `ccms_ins_db` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `status` tinyint(1) NOT NULL DEFAULT '0',
      `access` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0=www side 1=admin side',
      `grp` varchar(255) NOT NULL,
      `name` varchar(255) NOT NULL,
      `de` text NOT NULL,
      `en` text NOT NULL,
      `es` text NOT NULL,
      `fr` text NOT NULL,
      `ms` text NOT NULL,
      `pt` text NOT NULL,
      `ar` text NOT NULL,
      `bn` text NOT NULL,
      `ru` text NOT NULL,
      `he` text NOT NULL,
      `hi` text NOT NULL,
      `ja` text NOT NULL,
      `zh-cn` text NOT NULL,
      `zh-tw` text NOT NULL,
      PRIMARY KEY (`id`),
      KEY `CCMS_insDBPreload_idx` (`status`,`access`,`grp`)
    -- Dumping data for table `ccms_ins_db`
    INSERT INTO `ccms_ins_db` (`id`, `status`, `access`, `grp`, `name`, `de`, `en`, `es`, `fr`, `ms`, `pt`, `ar`, `bn`, `ru`, `he`, `hi`, `ja`, `zh-cn`, `zh-tw`) VALUES
    (1, 1, 0, 'index', 'para1', 'Der schnelle braune Fuchs springt über den faulen Hund.', 'The quick brown fox jumps over the lazy dog.', '', 'Le brun rapide le renard saute sur le chien paresseux.', '', '', 'ويقفز الثعلب البني السريع فوق الكلب الكسول.', '', '', '', '', '速い茶色のキツネは怠け者の犬を跳び越えます。', '那只敏捷的棕毛狐狸跃过那只懒狗。', ''),
    (2, 1, 0, 'index', 'para2', 'Wenn Zombies ankommen, schnell Richter Pat faxen.', 'When zombies arrive, quickly fax judge Pat.', '', 'Quand les zombies arrivent, faxent rapidement le juge Pat.', '', '', '', '', '', 'כאשר זומבים מגיעים, במהירות פקס לשפוט פט.', '', 'ゾンビが到着するとき、速くパット裁判官にファクスで送ってください。', '僵尸到达时,快速传真法官英保通™技术。', ''),
    (3, 1, 0, 'index', 'para3', 'Jede gute Kuh, Fuchs, Eichhörnchen, und Zebra mögen über glückliche Hunde springen.', 'Every good cow, fox, squirrel, and zebra likes to jump over happy dogs.', '', 'Chaque bonne vache, renard, l''écureuil et le zèbre aiment sauter sur des chiens heureux.', '', '', 'كل بقرة جيدة، الثعلب، السنجاب، وحمار وحشي يحب القفز فوق الكلاب سعيدة.', '', '', '', '', 'すべての良い雌牛、キツネ、リスと、シマウマが幸せな犬を跳び越えることを好みます。', '每个好的母牛、狐狸、鼠笼式,和斑马喜欢跳过快乐狗。', ''),
    (4, 1, 0, 'index', 'para4', 'Packen(Dichten) Sie meinen Kasten mit fünf Dutzend Alkohol-Krügen ein(ab).', 'Pack my box with five dozen liquor jugs.', '', 'Entassez ma boîte de cinq douzaines de cruches d''alcool.', '', '', '', '', '', 'לארוז התיבה שלי עם חמישה קנקני תריסר משקאות.', '', '5ダースの酒水差しで私の箱を満たしてください。', '包我”框中有五个十几个酒瓶。', ''),
    (6, 1, 0, 'page-1', 'para1', 'Wenn der Begriff Open wurde zuerst von Wiley verwendet, beschrieb sie Werke unter der Open Content License (a non-free-Share-Alike-Lizenz, siehe "Freie Inhalte" weiter unten) und vielleicht auch andere Werke unter ähnlichen Bedingungen lizenziert. [2] Es hat da kommen, um eine breitere Klasse von Inhalten beschreiben, ohne herkömmlichen urheberrechtlichen Beschränkungen. Die Offenheit der Inhalte können unter der ''5 Rs Rahmen "auf der Grundlage der Umfang, in dem sie wiederverwendet werden können, überarbeitet, neu gemischt und durch Mitglieder der Öffentlichkeit, ohne gegen das Urheberrecht neu verteilt beurteilt werden. [3] Im Gegensatz zu Open Source und freie Inhalte, gibt keine klare Schwelle, die eine Arbeit erreichen muss, um als "Open Content" zu qualifizieren.
    \r\nObwohl Open-Content hat als Gegengewicht zu Urheber beschrieben wurde, [4] Open-Content-Lizenzen verlassen sich auf Versorgung eines Urheberrechtsinhabers, um ihre Arbeit zu lizenzieren.', 'When the term OpenContent was first used by Wiley, it described works licensed under the Open Content License (a non-free share-alike license, see ''Free content'' below) and perhaps other works licensed under similar terms.[2] It has since come to describe a broader class of content without conventional copyright restrictions. The openness of content can be assessed under the ''5Rs Framework'' based on the extent to which it can be reused, revised, remixed and redistributed by members of the public without violating copyright law.[3] Unlike open source and free content, there is no clear threshold that a work must reach to qualify as ''open content''.
    \r\nAlthough open content has been described as a counterbalance to copyright,[4] open content licenses rely on a copyright holder''s power to license their work.', '', 'Lorsque le ContenuOuvert terme a été utilisé la première fois par John Wiley & Sons, il décrit les travaux autorisés en vertu de la licence Open Content (une licence de Share-Alike non-libre, voir «contenu libre» ci-dessous) et peut-être d''autres œuvres sous licence dans des conditions similaires. [2] Il a depuis lors pour décrire une classe plus large de contenu sans restrictions de droits d''auteur classiques. L''ouverture de contenu peut être évaluée en vertu du Cadre Rs ''5 ''sur la base de la mesure dans laquelle il peut être réutilisé, révisée, remixé et redistribué par les membres du public sans violer le droit d''auteur. [3] Contrairement à l''open source et du contenu gratuit, il n''existe pas de seuil clair qu''un travail doit atteindre pour être considéré comme ''contenu ouvert''.
    \r\nBien que le contenu ouvert a été décrit comme un contrepoids au droit d''auteur, [4] les licences de contenu ouvert s''appuient sur la puissance d''un titulaire de droit d''auteur d''autoriser leur travail.', '', '', '', '', '', '', '', '長期OpenContentが最初ワイリーによって使用された場合には、オープン·コンテンツ·ライセンスの下でライセンス作品を説明した(非フリー - 継承ライセンスは、下記の「無料コンテンツ」を参照)、および類似の用語の下でライセンスおそらく他の作品。[2]それが持っている以来、従来の著作権の制限なしにコンテンツのより広範なクラスを記述するために来る。コンテンツのオープン性は、それが再利用できる範囲、改訂されたリミックスと、著作権法に違反することなく、一般の人で再配布をもと''5ルピー枠組み」の下で評価することができる。そこに[3]とは異なり、オープンソースとフリーコンテンツ、仕事は「オープンコンテンツ」としての資格を到達しなければならない明確なしきい値はありません。
    \r\nオープンコンテンツは、著作権のカウンターバランスとして記載されているが、[4]オープンコンテンツライセンスは、自分の仕事をライセンスする著作権者の力に依存しています。', '当最早是由威利术语OpenContent的,它描述根据公开内容许可的作品(非自由 - 相同方式分享许可证,见“免费内容”下面),并在类似的条款授权也许还有其他的作品。[2]它有既然来形容更广泛类别的内容,而无需传统的版权限制。内容的开放性可以根据''5卢比框架“的基础上在何种程度上可以重复使用,修改,重新混音和不违反版权法的市民再分配进行评估。[3]不同于开源和免费的内容,有没有明确的门槛,一个作品必须达到有资格作为“开放内容”。
    \r\n虽然公开的内容已被描述为一个平衡的版权,[4]开放内容许可证依靠著作权人的权力,许可他人使用其作品。', ''), (7, 1, 0, 'page', 'title', 'Mehrsprachige Inhalt Beispiel - Seite # ', 'Multilingual Content Example - Page #', '', 'Exemple de contenu multilingue - Page n ° ', '', '', '', '', '', 'דוגמא תוכן רב לשוני - # עמוד', '', '多言語コンテンツ例 - ページ#', '多语种内容范例 - 页#', ''), (8, 1, 0, 'page-2', 'para1', 'Die Open Website einmal definiert Open als "zur Änderung, Verwendung und Umverteilung unter einer Lizenz ähnlich denen von der Open Source / Free Software-Gemeinschaft verwendet frei verfügbar". [3] Allerdings würde eine solche Definition der Open Content License auszuschließen (OPL) weil die Lizenz verbot Lade "eine Gebühr für die [Open] selbst", ein freier und Open-Source-Software-Lizenzen erforderlich rechts.
    \r\nDer Begriff, da in der Bedeutung verschoben und die Open Website beschreibt jetzt Offenheit als "Dauer Konstrukt". [3] Je mehr urheberrechtlich Berechtigungen für die Öffentlichkeit gewährt wird, desto offener ist der Inhalt. Die Schwelle für die Open-Content ist einfach, dass die Arbeit "in einer Weise, die Benutzer mit dem Recht auf mehr Arten von Anwendungen als die normalerweise unter dem Gesetz-ohne Kosten für den Benutzer zulässig zu machen bietet lizenziert."', 'The OpenContent website once defined OpenContent as ''freely available for modification, use and redistribution under a license similar to those used by the Open Source / Free Software community''.[3] However, such a definition would exclude the Open Content License (OPL) because that license forbade charging ''a fee for the [OpenContent] itself'', a right required by free and open source software licenses.
    \r\nThe term since shifted in meaning, and the OpenContent website now describes openness as a ''continuous construct''.[3] The more copyright permissions are granted to the general public, the more open the content is. The threshold for open content is simply that the work ''is licensed in a manner that provides users with the right to make more kinds of uses than those normally permitted under the law—at no cost to the user.''', '', 'Le site ContenuOuvert fois défini ContenuOuvert comme «librement disponible pour la modification, l''utilisation et la redistribution sous une licence similaire à ceux utilisés par la communauté du logiciel Open Source / libre». [3] Cependant, une telle définition exclurait l''Open Content License (OPL) parce que la licence interdit charge ''une redevance pour la [ContenuOuvert] lui-même », un droit requis par les licences de logiciels libres et gratuits.
    \r\nLe terme depuis changé de sens, et le site ContenuOuvert décrit maintenant l''ouverture comme une «construction continue». [3] Les autorisations plus de droits d''auteur sont accordées pour le grand public, plus ouvert que le contenu est. Le seuil de contenu libre est tout simplement que le travail »est autorisé d''une manière qui offre aux utilisateurs le droit de faire plusieurs types d''utilisations que celles normalement autorisées par la loi, sans frais pour l''utilisateur.', '', '', '', '', '', '', '', 'OpenContentのウェブサイトは、一度「オープンソース/フリーソフトウェアコミュニティによって使用されるものと同様のライセンスの下で変更、使用、再配布のための自由に利用できる」とOpenContentを定義しました。[3]しかし、このような定義は(OPL)を開き、コンテンツライセンスを除外しそのライセンスは、充電禁じているため''のための手数料を[OpenContent]自体''、フリーでオープンソースのソフトウェアライセンスが必要とする権利。
    \r\nこの用語は、以降の意味にシフトし、OpenContentのウェブサイトは現在、「継続的な構造」と開放性を説明しています。[3]より、著作権の権限を一般の人に付与され、よりオープンなコンテンツがある。オープンコンテンツの閾値は作業が「通常法律のユーザに無償で認めたもの以外の用途より多くの種類を行う権利をユーザーに提供した方法でライセンスされています。」という単純である', '该OpenContent的网站定义一次OpenContent的是“自由可根据类似于使用的开源/自由软件社区的许可的修改,使用和再分配”。[3]然而,这样的定义会排除开放内容许可证(OPL)因为该许可证禁止充电“的费用为[OpenContent的]本身”,由自由和开放源码软件许可证所需要的权利。
    \r\n这个词,因为转移的意义,以及OpenContent的网站现在描述的开放性为“连续结构”。[3]更多版权的权限授予给广大公众,更开放的内容。开放内容的阈值是一个简单的工作“已获得授权,可为用户提供做出多种用途,除根据法律规定,在没有成本的用户通常所允许的权利的方式。”', ''), (10, 1, 0, 'page', 'page-num', 'Seite #', 'Page #', '', 'Page n °', '', '', '', '', '', '# עמוד', '', 'ページ#', '页#', ''), (11, 1, 0, 'page-3', 'para1', 'Die 5RS freuen auf der Open Website als Rahmen für die Beurteilung, inwieweit die Inhalte offen legen:
    \r\nBewahren - das Recht zu machen, eigene und Steuer Kopien des Inhalts (zB, herunterladen, kopieren, speichern und verwalten)
    \r\nReuse - das Recht, die Inhalte in einer Vielzahl von Möglichkeiten (zB auf einer Website, in einer Klasse, in einer Studiengruppe, in einem Video)
    \r\nÜberarbeiten - das Recht, sich anzupassen, justieren, zu verändern, oder ändern Sie die Inhalte selbst (zB, zu übersetzen, den Inhalt in eine andere Sprache)
    \r\nRemix - das Recht, das Original oder überarbeitete Inhalte mit anderen Open-Content zu kombinieren, um etwas Neues zu schaffen (z. B. übernehmen den Inhalt in einem Mashup)
    \r\nVerteilen Sie - das Recht, Kopien der Original-Content, Ihre Revisionen oder Ihre Remixe mit anderen zu teilen (z. B. eine Kopie des Inhalts an einen Freund) [3]
    \r\nDiese breitere Definition unterscheidet Open-Content von Open-Source-Software, da diese müssen für die kommerzielle Nutzung und Anpassung von der Öffentlichkeit zur Verfügung stehen. Allerdings ist es ähnlich wie mehrere Definitionen für offene Bildungsressourcen, die Mittel im Rahmen nicht-kommerzielle und wörtlich Lizenzen enthalten. [5] [6]
    \r\nDie Open-Definition, die Open Content und Open Wissen definieren vorgibt, stützt sich stark auf der Open Source Definition; es die beschränkten Sinne des Open Content als libre Inhalt bewahrt. [7]', 'The 5Rs are put forward on the OpenContent website as a framework for assessing the extent to which content is open:
    \nRetain - the right to make, own, and control copies of the content (e.g., download, duplicate, store, and manage)
    \nReuse - the right to use the content in a wide range of ways (e.g., in a class, in a study group, on a website, in a video)
    \nRevise - the right to adapt, adjust, modify, or alter the content itself (e.g., translate the content into another language)
    \nRemix - the right to combine the original or revised content with other open content to create something new (e.g., incorporate the content into a mashup)
    \nRedistribute - the right to share copies of the original content, your revisions, or your remixes with others (e.g., give a copy of the content to a friend)[3]
    \nThis broader definition distinguishes open content from open source software, since the latter must be available for commercial use and adaptation by the public. However, it is similar to several definitions for open educational resources, which include resources under noncommercial and verbatim licenses.[5][6]
    \nThe Open Definition, which purports to define open content and open knowledge, draws heavily on the Open Source Definition; it preserves the limited sense of open content as libre content.[7]', '', 'Les 5R sont mis en avant sur ​​le site ContenuOuvert comme un cadre pour évaluer la mesure dans laquelle le contenu est ouvert:
    \r\nConservez - le droit de faire, propre, et des exemplaires de contrôle du contenu (par exemple, télécharger, reproduire, stocker et gérer)
    \r\nRéutiliser - le droit d''utiliser le contenu dans un large éventail de moyens (par exemple, dans une classe, dans un groupe d''étude, sur un site web, une vidéo)
    \r\nRéviser - le droit d''adapter, ajuster, modifier ou altérer le contenu lui-même (par exemple, de traduire le contenu dans une autre langue)
    \r\nRemix - le droit de combiner le contenu original ou révisé avec d''autres contenus ouverts pour créer quelque chose de nouveau (par exemple, intégrer le contenu dans un mashup)
    \r\nRedistribuer - le droit de partager des copies du contenu original, vos révisions ou vos remixes avec d''autres (par exemple, une copie de la page à un ami) [3]
    \r\nCette définition plus large distingue contenu ouvert de logiciels open source, puisque celui-ci doit être disponible pour un usage commercial et adaptation par le public. Cependant, il est semblable à plusieurs définitions pour les ressources éducatives libres, qui comprennent les ressources sous licences non commerciales et in extenso. [5] [6]
    \r\nLa définition de l''Open, qui vise à définir le contenu ouvert et la connaissance ouverte, s''appuie largement sur la définition de l''Open Source; il conserve le sens restreint de contenu ouvert que le contenu libre. [7]', '', '', '', '', '', '5Rs הם העלו באתר האינטרנט של OpenContent כמסגרת להערכת המידה שבה התוכן פתוח:
    \nשמור - הזכות לבצע,, ועותקי שליטה על התוכן (לדוגמא, הורדה, לשכפל, לאחסן ולנהל)
    \nשימוש חוזר - את הזכות להשתמש בתוכן במגוון רחב של דרכים (לדוגמא, בכיתה, בקבוצת מחקר, באתר אינטרנט, בוידאו)
    \nלשנות - את הזכות להתאים, להתאים, לשנות, או לשנות את התוכן עצמו (למשל, לתרגם את התוכן לשפה אחרת)
    \nRemix - את הזכות לשלב את התוכן המקורי או מתוקן עם תוכן פתוח אחר כדי ליצור משהו חדש (למשל, לשלב את התוכן לתוך mashup)
    \nלהפיץ מחדש - הזכות לשתף עותקים של התוכן המקורי, השינויים שלך, או רמיקסים שלך עם אחרים (למשל, לתת עותק של התוכן לחבר) [3]
    \nהגדרה רחבה יותר זו מייחדת תוכן פתוח מתוכנות קוד פתוחות, שכן זו האחרונה חייבת להיות זמינה לשימוש מסחרי והתאמה על-ידי הציבור. עם זאת, זה דומה לכמה הגדרות למשאבים חינוכיים פתוחים, הכוללים משאבים תחת רישיונות לא מסחריים ומילה במילה. [5] [6]
    \nההגדרה הפתוחה, אשר מתיימרת להגדיר תוכן פתוח וידע פתוח, מושכת בכבדות על הגדרת הקוד הפתוחה; הוא משמר את התחושה של תוכן פתוח כתוכן libre המוגבלת. [7]', '', '5RSが開かれているコンテンツの程度を評価するためのフレームワークとしてOpenContentのウェブサイトで提唱されています。
    \r\n保持 - する権利、自分自身、およびコンテンツの制御コピー(例えば、ダウンロード、複製、保存、および管理)
    \r\n再利用 - 方法の広い範囲内のコンテンツを使用する権利(ウェブサイト上で、研究グループでは、クラスでは、例えば、ビデオで)
    \r\n改訂 - 右、適応調整、修正、または変更コンテンツ自体(例えば、別の言語にコンテンツを翻訳する)
    \r\nためには \r\nリミックス - 何か新しいものを作成し、他のオープンコンテンツと、オリジナルまたは改訂内容を結合する権利(例えば、マッシュアップにコンテンツを組み込む)
    \r\n再配布 - (例えば、友人にコンテンツのコピーを与える)
    \r\nオープンコンテンツ、オープンな知識を定義するために主張しているオープン定義は、オープンソースの定義に大きく描く。それはリブレコンテンツとしてオープンコンテンツの限定された意味を保持します。[7]', '该5RS都提出了OpenContent的网站作为评估在何种程度上的内容是开放的框架上:
    \r\n保留 - 做出正确的,自己的,并对其内容的控制副本(例如,下载,复制,存储和管理)
    \r\n重用 - 使用在各种各样的方式内容的权利(例如,在一个类中,在一个研究小组,在网站上,在视频)
    \r\n修改 - 适应,调整,修改或改变内容本身(例如,翻译的内容成另一种语言)
    \r\n的权利 \r\n不怕 - 结合原有的或经修订的内容与其他公开内容,创造新的东西的权利(例如,把内容变成混搭)
    \r\n重新分配 - 与他人分享原始内容的副本,你的修改,或者你的混音(例如,给内容的副本发送给朋友)的权利[3]
    \r\n这种宽泛的定义区分开源软件的开放内容,因为后者必须可用于商业用途和适应公众。然而,它类似于几个定义为开放式教育资源,其中包括根据非商业和逐字牌照资源。[5] [6]
    \r\n开放的定义,这看来是确定开放内容和开放的知识,大量借鉴了开放源码定义;它保留了开放内容作为自由报内容的有限的意义。[7]', ''); -- -------------------------------------------------------- -- -- Table structure for table `ccms_lng_charset` -- CREATE TABLE IF NOT EXISTS `ccms_lng_charset` ( `id` int(11) NOT NULL AUTO_INCREMENT, `lngDesc` varchar(63) NOT NULL DEFAULT '', `status` tinyint(1) NOT NULL DEFAULT '0', `lng` varchar(5) NOT NULL, `default` tinyint(1) NOT NULL DEFAULT '0', `dir` char(3) NOT NULL COMMENT 'Character direction. ltr = left to right, rtl = right to left', `ptrLng` varchar(5) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=58 ; -- -- Dumping data for table `ccms_lng_charset` -- INSERT INTO `ccms_lng_charset` (`id`, `lngDesc`, `status`, `lng`, `default`, `dir`, `ptrLng`) VALUES (1, 'Deutsch (German)', 1, 'de', 0, 'ltr', ''), (2, 'Deutsch (Austria)', 1, 'de-at', 0, '', 'de'), (3, 'Deutsch (Germany)', 1, 'de-de', 0, '', 'de'), (4, 'Deutsch (Liechtenstein)', 1, 'de-li', 0, '', 'de'), (5, 'Deutsch (Luxembourg)', 1, 'de-lu', 0, '', 'de'), (6, 'Deutsch (Switzerland)', 1, 'de-ch', 0, '', 'de'), (7, 'English', 1, 'en', 1, 'ltr', ''), (8, 'English (Australia)', 1, 'en-au', 0, '', 'en'), (9, 'English (Belize)', 1, 'en-bz', 0, '', 'en'), (10, 'English (Canada)', 1, 'en-ca', 0, '', 'en'), (11, 'English (Ireland)', 1, 'en-ie', 0, '', 'en'), (12, 'English (Jamaica)', 1, 'en-jm', 0, '', 'en'), (13, 'English (New Zealand)', 1, 'en-nz', 0, '', 'en'), (14, 'English (Philippines)', 1, 'en-ph', 0, '', 'en'), (15, 'English (South Africa)', 1, 'en-za', 0, '', 'en'), (16, 'English (Trinidad and Tobago)', 1, 'en-tt', 0, '', 'en'), (17, 'English (United Kingdom)', 1, 'en-gb', 0, '', 'en'), (18, 'English (United States)', 1, 'en-us', 0, '', 'en'), (19, 'English (Zimbabwe)', 1, 'en-zw', 0, '', 'en'), (20, 'Español (Spanish)', 1, 'es', 0, 'ltr', ''), (21, 'Español (Argentina)', 1, 'es-ar', 0, '', 'es'), (22, 'Español (Bolivia)', 1, 'es-bo', 0, '', 'es'), (23, 'Español (Chile)', 1, 'es-cl', 0, '', 'es'), (24, 'Español (Colombia)', 1, 'es-co', 0, '', 'es'), (25, 'Español (Costa Rica)', 1, 'es-cr', 0, '', 'es'), (26, 'Español (Dominican Republic)', 1, 'es-do', 0, '', 'es'), (27, 'Español (Ecuador)', 1, 'es-ec', 0, '', 'es'), (28, 'Español (El Salvador)', 1, 'es-sv', 0, '', 'es'), (29, 'Español (Guatemala)', 1, 'es-gt', 0, '', 'es'), (30, 'Español (Honduras)', 1, 'es-hn', 0, '', 'es'), (31, 'Español (Mexico)', 1, 'es-mx', 0, '', 'es'), (32, 'Español (Nicaragua)', 1, 'es-ni', 0, '', 'es'), (33, 'Español (Panama)', 1, 'es-pa', 0, '', 'es'), (34, 'Español (Paraguay)', 1, 'es-py', 0, '', 'es'), (35, 'Español (Peru)', 1, 'es-pe', 0, '', 'es'), (36, 'Español (Puerto Rico)', 1, 'es-pr', 0, '', 'es'), (37, 'Español (Spain)', 1, 'es-es', 0, '', 'es'), (38, 'Español (Uruguay)', 1, 'es-uy', 0, '', 'es'), (39, 'Español (Venezuela)', 1, 'es-ve', 0, '', 'es'), (40, 'Français (French)', 1, 'fr', 0, 'ltr', ''), (41, 'Français (Belgium)', 1, 'fr-be', 0, '', 'fr'), (42, 'Français (Canada)', 1, 'fr-ca', 0, '', 'fr'), (43, 'Français (France)', 1, 'fr-fr', 0, '', 'fr'), (44, 'Français (Luxembourg)', 1, 'fr-lu', 0, '', 'fr'), (45, 'Français (Monaco)', 1, 'fr-mc', 0, '', 'fr'), (46, 'Français (Switzerland)', 1, 'fr-ch', 0, '', 'fr'), (47, 'Melayu Indonesia (Malay Indonesian)', 1, 'ms', 0, 'ltr', ''), (48, 'Português (Portuguese)', 1, 'pt', 0, 'ltr', ''), (49, 'العربية (Arabic)', 1, 'ar', 0, 'rtl', ''), (50, 'বাঙ্গালী (Bengali)', 1, 'bn', 0, 'ltr', ''), (51, 'Pусский (Russian)', 1, 'ru', 0, 'ltr', ''), (52, 'हिन्दी (Hindi)', 1, 'hi', 0, 'ltr', ''), (53, '日本語 (Japanese)', 1, 'ja', 0, 'ltr', ''), (54, '中国 (Chinese)', 1, 'zh', 0, '', 'zh-cn'), (55, '简体中国 (Simplified Chinese)', 1, 'zh-cn', 0, 'ltr', ''), (56, '中國傳統 (Traditional Chinese)', 1, 'zh-tw', 0, '', 'zh-cn'), (57, 'עברית (Hebrew)', 1, 'he', 0, 'rtl', ''); -- -------------------------------------------------------- -- -- Table structure for table `ccms_user_id` -- CREATE TABLE IF NOT EXISTS `ccms_user_id` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sid` varchar(32) NOT NULL, `expire` bigint(20) NOT NULL DEFAULT '0', `parm1` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `visitorsID` (`sid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Contains the login settings for fully registered users.' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `ccms_visitor_id` -- CREATE TABLE IF NOT EXISTS `ccms_visitor_id` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sid` varchar(32) NOT NULL, `expire` bigint(20) NOT NULL DEFAULT '0', `parm1` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `visitorsID` (`sid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Contains temporary data for unregistered users.' AUTO_INCREMENT=1 ; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


  1. Make a copy of /ccmspre/config_original.php and name it /ccmspre/config.php.
  2. Make a copy of /ccmspre/user_whitelist_original.php and name it /ccmspre/user_whitelist.php.
  3. Update /ccmspre/config.php with your domain name and database settings.
  4. Call your domain name in a browser and see what the setup script has to say.
  5. If all test come back as Passed you can delete or rename the /setup.php file and reload the page to continue.

More Information About This Release

There are two new major features added in this version CCMS.

  1. A new tag, CCMS_DB_DIR, which can be used on templates found in the /ccmstpl folder to help with the proper display of BIDI content.
  2. A new column in the ccms_lng_charset table named ptrLng. ptrLng can be used to redirect someone from one language code to another.
    e.g: Language codes en-ca, en-us and en-gb can all refer to content found in the en column of the ccms_ins_db table instead.


The CCMS_DB_DIR tag will only output the text ltr or rtl. All languages in the ccms_lng_charset database table, accept for pointer languages (ptrLng), must contain the text either ltr or rtl in the dir column which indicates the direction all content in that language is to be displayed on your site. CCMS will automatically determine which language to grab content for in a given section based on status and availability.

Example of languages which can be read from right-to-left:
  • العربية (Arabic: ar)
  • 简体中国 (Simplified Chinese: zh-hans)
  • 中国传统 (Traditional Chinese: zh-hant)
  • فارسی (Farsi: fa)
  • עברית (Hebrew: he, iw)
  • 日本人 (Japanese: ja)
  • اردو (Urdu: ur)
  • ייִדיש (Yiddish: yi, ji)
In the following examples, the para1 is found under the name column in the ccms_ins_db database table and currently only the en column contains any content. para2 contains both but will display the content in the desired language found in the visitors webpage request headers.
Note : para1 and para2 both contain translations of the same phrase in English, 'Hello world, this is a test. '.

HTML output for a request received by a visitor with en (English) sorted first in their Accept-Language headers:
							Hello world, this is a test.
Hello world, this is a test.
HTML output for a request received by a visitor with ar (Arabic) sorted first in their Accept-Language headers:
							Hello world, this is a test.
مرحبا العالم، وهذا هو الاختبار.
HTML output for a request received by a visitor with zh-cn (Simplified Chinese) sorted first in their Accept-Language headers:
							Hello world, this is a test.
HTML output for a request received by a visitor with zh-tw (Traditional Chinese) sorted first in their Accept-Language headers:
							Hello world, this is a test.
HTML output for a request received by a visitor with fa (Farsi) sorted first in their Accept-Language headers:
							Hello world, this is a test.
سلام جهان، این آزمون است.
HTML output for a request received by a visitor with he (Hebrew) sorted first in their Accept-Language headers:
							Hello world, this is a test.
שלום עולם, זה מבחן.
HTML output for a request received by a visitor with ja (Japanese) sorted first in their Accept-Language headers:
							Hello world, this is a test.
HTML output for a request received by a visitor with ur (Urdu) sorted first in their Accept-Language headers:
							Hello world, this is a test.
دنیا ہیلو، یہ ایک امتحان ہے.
HTML output for a request received by a visitor with yi (Yiddish) sorted first in their Accept-Language headers:
							Hello world, this is a test.
העלא וועלט, דעם איז אַ פּראָבע.
Rendered output all together, notice how the period at the end of the text or both have swaped sides/directions in the rtl content:

Hello world, this is a test.
مرحبا العالم، وهذا هو الاختبار.
سلام جهان، این آزمون است.
שלום עולם, זה מבחן.
دنیا ہیلو، یہ ایک امتحان ہے.
העלא וועלט, דעם איז אַ פּראָבע.


The ptrLng (Pointer Language) column, in the ccms_lng_charset database table, is an important new feature for sites that contain content in languages that have a lot of regional diversity such as English, French and Spanish. All of which are in use as the official first or second language by dozens of countries around the world. But often when languages spread to new areas or have been regionally located for a long time dialects and speech pattern differences will arise.

For example: English can be divided into approx 16 different regions or catagories, here is a sample:
  • English Catch All (en)
  • Australia (en-au)
  • Belize (en-bz)
  • Canada (en-ca)
  • Ireland (en-ie)
  • Jamaica (en-jm)
  • New Zealand (en-nz)
  • Philippines (en-ph)
  • South Africa (en-za)
  • Trinidad and Tobago (en-tt)
  • United Kingdom (en-gb)
  • United States (en-us)
  • Zimbabwe (en-ez)
Though you can write content for each regional code and keep everything separate, a common practice when working with languages like English is to set en as the ptrLng language for all the English regions. That way if anyone ever comes to your site with the Accept-Language headers set to en-ca it will pull the content from en instead. Likewise, if someone visits your site with the Accept-Language headers set to en-za they will also be directed to pull content from en instead. This saves the amount of copy you many need to write while giving you the option of customizing it for each region later.

This screen shot shows the settings for about 20 language codes in the ccms_lng_charset table of CCMS. Notice that both German (de) and English (en) are being pointed to by all of their regional language codes.

Adding Content in Many Languages

The following is a guide on how to add new languages and content to the database using phpMyAdmin. Once the new admin system is ready this will become trivial.

Add the browser language codes you want your site to support to the ccms_lng_charset table above and set one of them to default (1). Check here for a full list of codes: or You do not need to keep all the languages codes that are installed by the /ccms-db-setup.sql file, they are just there as an example for you and to help demonstrate what a site supporting a large number of languages and pointer languages might look like. (If you change the languages you wish to support in the ccms_lng_charset table remember to add or remove language columns as needed in the ccms_ins_db table aswell.)

If you are adding a new pointer language (ptrLng) you do not need to include the character direction (dir) or a language column in the ccms_ins_db table. Only languages which are not pointers require the dir field be filled in and a column in the ccms_ins_db table.

Add columns for each of your new language codes to the ccms_ins_db table. Accept for ptrLng records.

Add records to the ccms_ins_db table containing the grp, name and content for each language you would like to view in your website.

Place the CCMS_DB_PRELOAD tag at the top of your html to preload all the ccms_ins_db grp records into memory that you might need for a given page.

						{CCMS_DB_PRELOAD:index}<!DOCTYPE html>
								<meta charset="utf-8">

Then use the CCMS_DB tag to display database content. CCMS will automatically determine if the prefered language of the visitors browser is even supported by your website and display content from your database in the correct language, if available. Otherwise the websites default language will be displayed.

						<p style="max-width: 640px">
							<span style="color: rgb(134, 177, 53); margin: 5px; padding: 5px;">
							</span><br />
							<br />

Contact Us

778 786 2423

1310 Fraser Ave
Port Coquitlam, BC, Canada
V3B 1M4
(10 minutes from Vancouver)

Copyright © 2017 Modus Internet. All rights reserved.