design.pot 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761
  1. # SOME DESCRIPTIVE TITLE.
  2. # Copyright (C) 2013, Various
  3. # This file is distributed under the same license as the Elgg package.
  4. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
  5. #
  6. #, fuzzy
  7. msgid ""
  8. msgstr ""
  9. "Project-Id-Version: Elgg 1.12\n"
  10. "Report-Msgid-Bugs-To: \n"
  11. "POT-Creation-Date: 2016-03-06 18:02+0200\n"
  12. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  13. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  14. "Language-Team: LANGUAGE <LL@li.org>\n"
  15. "MIME-Version: 1.0\n"
  16. "Content-Type: text/plain; charset=UTF-8\n"
  17. "Content-Transfer-Encoding: 8bit\n"
  18. #: ../../design/actions.rst:2
  19. msgid "Actions"
  20. msgstr ""
  21. #: ../../design/actions.rst:4
  22. msgid "Actions are the primary way users interact with an Elgg site."
  23. msgstr ""
  24. #: ../../design/actions.rst:10
  25. #: ../../design/amd.rst:8
  26. #: ../../design/database.rst:11
  27. #: ../../design/events.rst:9
  28. msgid "Overview"
  29. msgstr ""
  30. #: ../../design/actions.rst:12
  31. msgid "An action in Elgg is the code that runs to make changes to the database when a user does something. For example, logging in, posting a comment, and making a blog post are actions. The action script processes input, makes the appropriate modifications to the database, and provides feedback to the user about the action."
  32. msgstr ""
  33. #: ../../design/actions.rst:15
  34. msgid "Action Handler"
  35. msgstr ""
  36. #: ../../design/actions.rst:17
  37. msgid "Actions are registered during the boot process by calling ``elgg_register_action()``. All actions URLs start with ``action/`` and are served by Elgg's front end controller through the action service. This approach is different from traditional PHP applications that send information to a specific file. The action service performs :doc:`CSRF security checks </design/security>`, and calls the registered action script file, then optionally forwards the user to a new page. By using the action service instead of a single script file, Elgg automatically provides increased security and extensibility."
  38. msgstr ""
  39. #: ../../design/actions.rst:19
  40. msgid "In Elgg 1.8 and before, actions were handled by an action handler script in ```engine/handlers/action_handler.php``. This required specific rewrite rules for URLs beginning with ``/action/``."
  41. msgstr ""
  42. #: ../../design/actions.rst:21
  43. msgid "See :doc:`/guides/actions` for details on how to register and construct an action. To look at the core actions, check out the directory /actions."
  44. msgstr ""
  45. #: ../../design/amd.rst:2
  46. msgid "AMD"
  47. msgstr ""
  48. #: ../../design/amd.rst:10
  49. msgid "There are two JavaScript system in Elgg: the deprecated 1.8 system, and the newer `AMD (Asynchronous Module Definition) <http://requirejs.org/docs/whyamd.html>`_ compatible system introduced in 1.9."
  50. msgstr ""
  51. #: ../../design/amd.rst:13
  52. msgid "This discusses the benefits of using AMD in Elgg."
  53. msgstr ""
  54. #: ../../design/amd.rst:16
  55. msgid "Why AMD?"
  56. msgstr ""
  57. #: ../../design/amd.rst:18
  58. msgid "We have been working hard to make Elgg's JavaScript more maintainable and useful. We made some strides in 1.8 with the introduction of the \"``elgg``\" JavaScript object and library, but have quickly realized the approach we were taking was not scalable."
  59. msgstr ""
  60. #: ../../design/amd.rst:22
  61. msgid "The size of `JS on the web is growing <http://httparchive.org/trends.php?s=All&minlabel=Feb+11+2011&maxlabel=Feb+1+2013#bytesJS&reqJS>`_ quickly, and JS in Elgg is growing too. We want Elgg to be able to offer a solution that makes JS development as productive and maintainable as possible going forward."
  62. msgstr ""
  63. #: ../../design/amd.rst:27
  64. msgid "The `reasons to choose AMD <http://requirejs.org/docs/whyamd.html>`_ are plenteous and well-documented. Let's highlight just a few of the most relevant reasons as they relate to Elgg specifically."
  65. msgstr ""
  66. #: ../../design/amd.rst:32
  67. msgid "1. Simplified dependency management"
  68. msgstr ""
  69. #: ../../design/amd.rst:33
  70. msgid "AMD modules load asynchronously and execute as soon as their dependencies are available, so this eliminates the need to specify \"priority\" and \"location\" when registering JS libs in Elgg. Also, you don't need to worry about explicitly loading a module's dependencies in PHP. The AMD loader (RequireJS in this case) takes care of all that hassle for you. It's also possible have `text dependencies <http://requirejs.org/docs/api.html#text>`_ with the RequireJS text plugin, so client-side templating should be a breeze."
  71. msgstr ""
  72. #: ../../design/amd.rst:41
  73. msgid "2. AMD works in all browsers. Today."
  74. msgstr ""
  75. #: ../../design/amd.rst:42
  76. msgid "Elgg developers are already writing lots of JavaScript. We know you want to write more. We cannot accept waiting 5-10 years for a native JS modules solution to be available in all browsers before we can organize our JavaScript in a maintainable way."
  77. msgstr ""
  78. #: ../../design/amd.rst:47
  79. msgid "3. You do not need a build step to develop in AMD."
  80. msgstr ""
  81. #: ../../design/amd.rst:48
  82. msgid "We like the edit-refresh cycle of web development. We wanted to make sure everyone developing in Elgg could continue experiencing that joy. Synchronous module formats like Closure or CommonJS just weren't an option for us. But even though AMD doesn't require a build step, *it is still very build-friendly*. Because of the ``define()`` wrapper, it's possible to concatenate multiple modules into a single file and ship them all at once in a production environment. [#]_"
  83. msgstr ""
  84. #: ../../design/amd.rst:54
  85. msgid "AMD is a battle-tested and well thought out module loading system for the web today. We're very thankful for the work that has gone into it, and are excited to offer it as the standard solution for JavaScript development in Elgg starting with Elgg 1.9."
  86. msgstr ""
  87. #: ../../design/amd.rst:58
  88. msgid "This is not currently supported by Elgg core, but we'll be looking into it since reducing round-trips is critical for a good first-view experience, especially on mobile devices."
  89. msgstr ""
  90. #: ../../design/database.rst:2
  91. msgid "Database"
  92. msgstr ""
  93. #: ../../design/database.rst:4
  94. msgid "A thorough discussion of Elgg's data model design and motivation."
  95. msgstr ""
  96. #: ../../design/database.rst:0
  97. #: ../../design/events.rst:0
  98. #: ../../design/security.rst:0
  99. msgid "Contents"
  100. msgstr ""
  101. #: ../../design/database.rst:13
  102. msgid "In Elgg, everything runs on a unified data model based on atomic units of data called entities."
  103. msgstr ""
  104. #: ../../design/database.rst:16
  105. msgid "Plugins are discouraged from interacting directly with the database, which creates a more stable system and a better user experience becase content created by different plugins can be mixed together in consistent ways. With this approach, plugins are faster to develop, and are at the same time much more powerful."
  106. msgstr ""
  107. #: ../../design/database.rst:22
  108. msgid "Every entity in the system inherits the ``ElggEntity`` class. This class controls access permissions, ownership"
  109. msgstr ""
  110. #: ../../design/database.rst:27
  111. msgid "You can extend entities with extra information in two ways:"
  112. msgstr ""
  113. #: ../../design/database.rst:31
  114. msgid "``Metadata``: This is information describing the entity, usually"
  115. msgstr ""
  116. #: ../../design/database.rst:30
  117. msgid "added by the author of the entity when the entity is created. For example, tags, an ISBN number, a file location, or source language is metadata."
  118. msgstr ""
  119. #: ../../design/database.rst:36
  120. msgid "``Annotations``: This is information about the entity, usually"
  121. msgstr ""
  122. #: ../../design/database.rst:34
  123. msgid "added by a third party after the entity is created. For example, ratings, likes, and votes are annotations. (Comments were before 1.9.)"
  124. msgstr ""
  125. #: ../../design/database.rst:39
  126. msgid "Datamodel"
  127. msgstr ""
  128. #: ../../design/database.rst:46
  129. msgid "The Elgg data model diagram"
  130. msgstr ""
  131. #: ../../design/database.rst:49
  132. msgid "Entities"
  133. msgstr ""
  134. #: ../../design/database.rst:51
  135. msgid "``ElggEntity`` is the base class for the Elgg data model and supports a common set of properties and methods."
  136. msgstr ""
  137. #: ../../design/database.rst:54
  138. msgid "A numeric Globally Unique IDentifier (See `GUIDs`_)."
  139. msgstr ""
  140. #: ../../design/database.rst:55
  141. msgid "Access permissions. (When a plugin requests data, it never gets to touch data that the current user doesn't have permission to see.)"
  142. msgstr ""
  143. #: ../../design/database.rst:57
  144. msgid "An arbitrary subtype (more below)."
  145. msgstr ""
  146. #: ../../design/database.rst:58
  147. msgid "An owner."
  148. msgstr ""
  149. #: ../../design/database.rst:59
  150. msgid "The site that the entity belongs to."
  151. msgstr ""
  152. #: ../../design/database.rst:60
  153. msgid "A container, used to associate content with a group or a user."
  154. msgstr ""
  155. #: ../../design/database.rst:63
  156. msgid "Types"
  157. msgstr ""
  158. #: ../../design/database.rst:65
  159. msgid "*Actual* entities will be instances of four different subclasses, each having a distinct **type** property and their own additional properties and methods."
  160. msgstr ""
  161. #: ../../design/database.rst:69
  162. msgid "Type"
  163. msgstr ""
  164. #: ../../design/database.rst:69
  165. msgid "PHP class"
  166. msgstr ""
  167. #: ../../design/database.rst:69
  168. #: ../../design/database.rst:594
  169. msgid "Represents"
  170. msgstr ""
  171. #: ../../design/database.rst:71
  172. msgid "object"
  173. msgstr ""
  174. #: ../../design/database.rst:71
  175. msgid "``ElggObject``"
  176. msgstr ""
  177. #: ../../design/database.rst:71
  178. msgid "Most user-created content, like blog posts, uploads, and bookmarks."
  179. msgstr ""
  180. #: ../../design/database.rst:72
  181. msgid "group"
  182. msgstr ""
  183. #: ../../design/database.rst:72
  184. msgid "``ElggGroup``"
  185. msgstr ""
  186. #: ../../design/database.rst:72
  187. msgid "An organized group of users with its own profile page"
  188. msgstr ""
  189. #: ../../design/database.rst:73
  190. msgid "user"
  191. msgstr ""
  192. #: ../../design/database.rst:73
  193. msgid "``ElggUser``"
  194. msgstr ""
  195. #: ../../design/database.rst:73
  196. msgid "A system user"
  197. msgstr ""
  198. #: ../../design/database.rst:74
  199. msgid "site"
  200. msgstr ""
  201. #: ../../design/database.rst:74
  202. msgid "``ElggSite``"
  203. msgstr ""
  204. #: ../../design/database.rst:74
  205. msgid "The site served by the Elgg installation"
  206. msgstr ""
  207. #: ../../design/database.rst:77
  208. msgid "Each has its own extended API. E.g. objects have a ``title`` and ``description``, users have a ``username`` and a way to set their password, and so on."
  209. msgstr ""
  210. #: ../../design/database.rst:81
  211. msgid "Subtypes"
  212. msgstr ""
  213. #: ../../design/database.rst:83
  214. msgid "Each entity also has a custom string **subtype**, which plugins use to further specialize the entity. Elgg makes it easy to query specific subtypes as well as assign them special behaviors and views."
  215. msgstr ""
  216. #: ../../design/database.rst:86
  217. msgid "Subtypes are most commonly given to instances of ElggObject to denote the kind of content created. E.g. the blog plugin creates objects with subtype ``\"blog\"``."
  218. msgstr ""
  219. #: ../../design/database.rst:89
  220. msgid "For historic reasons, the subtype API is a bit complex, but boils down to: write to ``->subtype`` before saving, otherwise always read ``getSubtype()``. Below are more details."
  221. msgstr ""
  222. #: ../../design/database.rst:93
  223. msgid "Subtype Gotchas"
  224. msgstr ""
  225. #: ../../design/database.rst:95
  226. msgid "Before an entity's ``save()`` method is called, the subtype can be set by writing a string to the ``subtype`` property."
  227. msgstr ""
  228. #: ../../design/database.rst:97
  229. msgid "*Subtype cannot be changed after saving.*"
  230. msgstr ""
  231. #: ../../design/database.rst:98
  232. msgid "After saving, you must always use ``getSubtype()`` to read it."
  233. msgstr ""
  234. #: ../../design/database.rst:99
  235. msgid "If no subtype was set, ``\"\"`` is returned, however some parts of the Elgg API (like Views) may map this value to the string ``\"default\"``. E.g. a group with ``getSubtype() === \"\"`` will be rendered using the view ``\"group/default\"``."
  236. msgstr ""
  237. #: ../../design/database.rst:102
  238. msgid "Read carefully the documentation for ``elgg_get_entities()`` before trying to match subtypes; this"
  239. msgstr ""
  240. #: ../../design/database.rst:103
  241. msgid "API is a bit of a minefield. E.g. you cannot use ``\"\"`` to fetch entities with the default subtype."
  242. msgstr ""
  243. #: ../../design/database.rst:106
  244. msgid "GUIDs"
  245. msgstr ""
  246. #: ../../design/database.rst:108
  247. msgid "A GUID is an integer that uniquely identifies every entity in an Elgg installation (a Globally Unique IDentifier). It's assigned automatically when the entity is first saved and can never be changed."
  248. msgstr ""
  249. #: ../../design/database.rst:112
  250. msgid "Some Elgg API functions work with GUIDs instead of ``ElggEntity`` objects."
  251. msgstr ""
  252. #: ../../design/database.rst:115
  253. msgid "ElggObject"
  254. msgstr ""
  255. #: ../../design/database.rst:117
  256. msgid "The ``ElggObject`` entity type represents arbitrary content within an Elgg install; things like blog posts, uploaded files, etc."
  257. msgstr ""
  258. #: ../../design/database.rst:120
  259. msgid "Beyond the standard ElggEntity properties, ElggObjects also support:"
  260. msgstr ""
  261. #: ../../design/database.rst:122
  262. msgid "``title`` The title of the object (HTML escaped text)"
  263. msgstr ""
  264. #: ../../design/database.rst:123
  265. msgid "``description`` A description of the object (HTML)"
  266. msgstr ""
  267. #: ../../design/database.rst:125
  268. msgid "Most other data about the object is generally stored via metadata."
  269. msgstr ""
  270. #: ../../design/database.rst:128
  271. msgid "ElggUser"
  272. msgstr ""
  273. #: ../../design/database.rst:130
  274. msgid "The ``ElggUser`` entity type represents users within an Elgg install. These will be set to disabled until their accounts have been activated (unless they were created from within the admin panel)."
  275. msgstr ""
  276. #: ../../design/database.rst:134
  277. msgid "Beyond the standard ElggEntity properties, ElggUsers also support:"
  278. msgstr ""
  279. #: ../../design/database.rst:136
  280. msgid "``name`` The user's plain text name. e.g. \"Hugh Jackman\""
  281. msgstr ""
  282. #: ../../design/database.rst:137
  283. msgid "``username`` Their login name. E.g. \"hjackman\""
  284. msgstr ""
  285. #: ../../design/database.rst:138
  286. msgid "``password`` A hashed version of their password"
  287. msgstr ""
  288. #: ../../design/database.rst:139
  289. msgid "``salt`` The salt that their password has been hashed with"
  290. msgstr ""
  291. #: ../../design/database.rst:140
  292. msgid "``email`` Their email address"
  293. msgstr ""
  294. #: ../../design/database.rst:141
  295. msgid "``language`` Their default language code."
  296. msgstr ""
  297. #: ../../design/database.rst:142
  298. msgid "``code`` Their session code (moved to a separate table in 1.9)."
  299. msgstr ""
  300. #: ../../design/database.rst:143
  301. msgid "``last_action`` The UNIX timestamp of the last time they loaded a page"
  302. msgstr ""
  303. #: ../../design/database.rst:144
  304. msgid "``prev_last_action`` The previous value of ``last_action``"
  305. msgstr ""
  306. #: ../../design/database.rst:145
  307. msgid "``last_login`` The UNIX timestamp of their last log in"
  308. msgstr ""
  309. #: ../../design/database.rst:146
  310. msgid "``prev_last_login`` the previous value of ``last_login``"
  311. msgstr ""
  312. #: ../../design/database.rst:149
  313. msgid "ElggSite"
  314. msgstr ""
  315. #: ../../design/database.rst:151
  316. msgid "The ``ElggSite`` entity type represents sites within your Elgg install. Most installs will have only one."
  317. msgstr ""
  318. #: ../../design/database.rst:154
  319. msgid "Beyond the standard ElggEntity properties, ElggSites also support:"
  320. msgstr ""
  321. #: ../../design/database.rst:156
  322. msgid "``name`` The site name"
  323. msgstr ""
  324. #: ../../design/database.rst:157
  325. msgid "``description`` A description of the site"
  326. msgstr ""
  327. #: ../../design/database.rst:158
  328. msgid "``url`` The address of the site"
  329. msgstr ""
  330. #: ../../design/database.rst:161
  331. msgid "ElggGroup"
  332. msgstr ""
  333. #: ../../design/database.rst:163
  334. msgid "The ``ElggGroup`` entity type represents an association of Elgg users. Users can join, leave, and post content to groups."
  335. msgstr ""
  336. #: ../../design/database.rst:166
  337. msgid "Beyond the standard ElggEntity properties, ElggGroups also support:"
  338. msgstr ""
  339. #: ../../design/database.rst:168
  340. msgid "``name`` The group's name (HTML escaped text)"
  341. msgstr ""
  342. #: ../../design/database.rst:169
  343. msgid "``description`` A description of the group (HTML)"
  344. msgstr ""
  345. #: ../../design/database.rst:171
  346. msgid "``ElggGroup`` has addition methods to manage content and membership."
  347. msgstr ""
  348. #: ../../design/database.rst:174
  349. msgid "The Groups plugin"
  350. msgstr ""
  351. #: ../../design/database.rst:176
  352. msgid "Not to be confused with the entity type ``ElggGroup``, Elgg comes with a plugin called \"Groups\" that provides a default UI/UX for site users to interact with groups. Each group is given a discussion forum and a profile page linking users to content within the group."
  353. msgstr ""
  354. #: ../../design/database.rst:181
  355. msgid "You can alter the user experience via the traditional means of extending plugins or completely replace the Groups plugin with your own."
  356. msgstr ""
  357. #: ../../design/database.rst:184
  358. msgid "Because ``ElggGroup`` can be subtyped like all other ElggEntities, you can have multiple types of groups running on the same site."
  359. msgstr ""
  360. #: ../../design/database.rst:188
  361. msgid "Writing a group-aware plugin"
  362. msgstr ""
  363. #: ../../design/database.rst:190
  364. msgid "Plugin owners need not worry too much about writing group-aware functionality, but there are a few key points:"
  365. msgstr ""
  366. #: ../../design/database.rst:194
  367. msgid "Adding content"
  368. msgstr ""
  369. #: ../../design/database.rst:196
  370. msgid "By passing along the group as ``container_guid`` via a hidden input field, you can use a single form and action to add both user and group content."
  371. msgstr ""
  372. #: ../../design/database.rst:199
  373. msgid "Use `can_write_to_container <http://reference.elgg.org/entities_8php.html#16a972909c7cb75f646cb707be001a6f>`_ to determine whether or not the current user has the right to add content to a group."
  374. msgstr ""
  375. #: ../../design/database.rst:204
  376. msgid "Be aware that you will then need to pass the container GUID or username to the page responsible for posting and the accompanying value, so that this can then be stored in your form as a hidden input field, for easy passing to your actions. Within a \"create\" action, you'll need to take in this input field and save it as a property of your new element (defaulting to the current user's container):"
  377. msgstr ""
  378. #: ../../design/database.rst:232
  379. msgid "Usernames and page ownership"
  380. msgstr ""
  381. #: ../../design/database.rst:234
  382. msgid "Groups have a simulated username of the form *group:\\ GUID*, which you can get the value of by checking ``$group->username``. If you pass this username to a page on the URL line as part of the ``username`` variable (i.e., ``/yourpage?username=group:nnn``), Elgg will automatically register that group as being the owner of the page (unless overridden)."
  383. msgstr ""
  384. #: ../../design/database.rst:241
  385. msgid "Juggling users and groups"
  386. msgstr ""
  387. #: ../../design/database.rst:243
  388. msgid "In fact, ``[[Engine/DataModel/Entities/ElggGroup|ElggGroup]]`` simulates most of the methods of ``[[Engine/DataModel/Entities/ElggUser|ElggUser]]``. You can grab the icon, name etc using the same calls, and if you ask for a group's friends, you'll get its members. This has been designed specifically for you to alternate between groups and users in your code easily."
  389. msgstr ""
  390. #: ../../design/database.rst:251
  391. msgid "Menu options"
  392. msgstr ""
  393. #: ../../design/database.rst:253
  394. msgid "***This section is deprecated as of Elgg 1.8***"
  395. msgstr ""
  396. #: ../../design/database.rst:255
  397. msgid "The final piece of the puzzle, for default groups, is to add a link to your functionality from the group's profile. Here we'll use the file plugin as an example."
  398. msgstr ""
  399. #: ../../design/database.rst:259
  400. msgid "This involves creating a view within your plugin - in this case file/menu - which will extend the group's menu. File/menu consists of a link within paragraph tags that points to the file repository of the page\\_owner():"
  401. msgstr ""
  402. #: ../../design/database.rst:272
  403. msgid "You can then extend the group's menu view with this one, within your plugin's input function (in this case file\\_init):"
  404. msgstr ""
  405. #: ../../design/database.rst:280
  406. msgid "Ownership"
  407. msgstr ""
  408. #: ../../design/database.rst:282
  409. msgid "Entities have a ``owner_guid`` GUID property, which defines its owner. Typically this refers to the GUID of a user, although sites and users themselves often have no owner (a value of 0)."
  410. msgstr ""
  411. #: ../../design/database.rst:286
  412. msgid "The ownership of an entity dictates, in part, whether or not you can access or edit that entity."
  413. msgstr ""
  414. #: ../../design/database.rst:290
  415. msgid "Containers"
  416. msgstr ""
  417. #: ../../design/database.rst:292
  418. msgid "In order to easily search content by group or by user, content is generally set to be \"contained\" by either the user who posted it, or the group to which the user posted. This means the new object's ``container_guid`` property will be set to the GUID of the current ElggUser or the target ElggGroup."
  419. msgstr ""
  420. #: ../../design/database.rst:297
  421. msgid "E.g., three blog posts may be owned by different authors, but all be contained by the group they were posted to."
  422. msgstr ""
  423. #: ../../design/database.rst:300
  424. msgid "Note: This is not always true. Comment entities are contained by the object commented upon, and in some 3rd party plugins the container may be used to model a parent-child relationship between entities (e.g. a \"folder\" object containing a file object)."
  425. msgstr ""
  426. #: ../../design/database.rst:306
  427. msgid "Annotations"
  428. msgstr ""
  429. #: ../../design/database.rst:308
  430. msgid "Annotations are pieces of data attached to an entity that allow users to leave ratings, or other relevant feedback. A poll plugin might register votes as annotations. Before Elgg 1.9, comments and group discussion replies were stored as annotations."
  431. msgstr ""
  432. #: ../../design/database.rst:313
  433. msgid "Annotations are stored as instances of the ``ElggAnnotation`` class."
  434. msgstr ""
  435. #: ../../design/database.rst:315
  436. msgid "Each annotation has:"
  437. msgstr ""
  438. #: ../../design/database.rst:317
  439. msgid "An internal annotation type (like *comment*)"
  440. msgstr ""
  441. #: ../../design/database.rst:318
  442. msgid "A value (which can be a string or integer)"
  443. msgstr ""
  444. #: ../../design/database.rst:319
  445. msgid "An access permission distinct from the entity it's attached to"
  446. msgstr ""
  447. #: ../../design/database.rst:320
  448. msgid "An owner"
  449. msgstr ""
  450. #: ../../design/database.rst:323
  451. msgid "Adding an annotation"
  452. msgstr ""
  453. #: ../../design/database.rst:325
  454. msgid "The easiest way to annotate is to use the ``annotate`` method on an entity, which is defined as:"
  455. msgstr ""
  456. #: ../../design/database.rst:338
  457. msgid "For example, to leave a rating on an entity, you might call:"
  458. msgstr ""
  459. #: ../../design/database.rst:345
  460. msgid "Reading annotations"
  461. msgstr ""
  462. #: ../../design/database.rst:347
  463. msgid "To retrieve annotations on an object, you can call the following method:"
  464. msgstr ""
  465. #: ../../design/database.rst:358
  466. msgid "If your annotation type largely deals with integer values, a couple of useful mathematical functions are provided:"
  467. msgstr ""
  468. #: ../../design/database.rst:369
  469. msgid "Useful helper functions"
  470. msgstr ""
  471. #: ../../design/database.rst:372
  472. msgid "Comments"
  473. msgstr ""
  474. #: ../../design/database.rst:374
  475. msgid "If you want to provide comment functionality on your plugin objects, the following function will provide the full listing, form and actions:"
  476. msgstr ""
  477. #: ../../design/database.rst:383
  478. msgid "Metadata"
  479. msgstr ""
  480. #: ../../design/database.rst:385
  481. msgid "Metadata in Elgg allows you to store extra data on an ``entity`` beyond the built-in fields that entity supports. For example, ``ElggObjects`` only support the basic entity fields plus title and description, but you might want to include tags or an ISBN number. Similarly, you might want users to be able to save a date of birth."
  482. msgstr ""
  483. #: ../../design/database.rst:391
  484. msgid "Under the hood, metadata is stored as an instance of the ``ElggMetadata`` class, but you don't need to worry about that in practice (although if you're interested, see the ``ElggMetadata`` class reference). What you need to know is:"
  485. msgstr ""
  486. #: ../../design/database.rst:396
  487. msgid "Metadata has an owner and access ID, both of which may be different to the owner of the entity it's attached to"
  488. msgstr ""
  489. #: ../../design/database.rst:398
  490. msgid "You can potentially have multiple items of each type of metadata attached to a single entity"
  491. msgstr ""
  492. #: ../../design/database.rst:402
  493. msgid "The simple case"
  494. msgstr ""
  495. #: ../../design/database.rst:405
  496. #: ../../design/database.rst:474
  497. msgid "Adding metadata"
  498. msgstr ""
  499. #: ../../design/database.rst:407
  500. msgid "To add a piece of metadata to an entity, just call:"
  501. msgstr ""
  502. #: ../../design/database.rst:413
  503. msgid "For example, to add a date of birth to a user:"
  504. msgstr ""
  505. #: ../../design/database.rst:419
  506. msgid "Or to add a couple of tags to an object:"
  507. msgstr ""
  508. #: ../../design/database.rst:425
  509. msgid "When adding metadata like this:"
  510. msgstr ""
  511. #: ../../design/database.rst:427
  512. msgid "The owner is set to the currently logged-in user"
  513. msgstr ""
  514. #: ../../design/database.rst:428
  515. msgid "Access permissions are inherited from the entity"
  516. msgstr ""
  517. #: ../../design/database.rst:429
  518. msgid "Reassigning a piece of metadata will overwrite the old value"
  519. msgstr ""
  520. #: ../../design/database.rst:431
  521. msgid "This is suitable for most purposes. Be careful to note which attributes are metadata and which are built in to the entity type that you are working with. You do not need to save an entity after adding or updating metadata. You do need to save an entity if you have changed one of its built in attributes. As an example, if you changed the access id of an ElggObject, you need to save it or the change isn't pushed to the database."
  522. msgstr ""
  523. #: ../../design/database.rst:440
  524. #: ../../design/database.rst:516
  525. msgid "Reading metadata"
  526. msgstr ""
  527. #: ../../design/database.rst:442
  528. msgid "To retrieve metadata, treat it as a property of the entity:"
  529. msgstr ""
  530. #: ../../design/database.rst:448
  531. msgid "Note that this will return the absolute value of the metadata. To get metadata as an ElggMetadata object, you will need to use the methods described in the *finer control* section below."
  532. msgstr ""
  533. #: ../../design/database.rst:452
  534. msgid "If you stored multiple values in this piece of metadata (as in the \"tags\" example above), you will get an array of all those values back. If you stored only one value, you will get a string or integer back. Storing an array with only one value will return a string back to you. E.g."
  535. msgstr ""
  536. #: ../../design/database.rst:464
  537. msgid "To always get an array back, simply cast to an array;"
  538. msgstr ""
  539. #: ../../design/database.rst:471
  540. msgid "Finer control"
  541. msgstr ""
  542. #: ../../design/database.rst:476
  543. msgid "If you need more control, for example to assign an access ID other than the default, you can use the ``create_metadata`` function, which is defined as follows:"
  544. msgstr ""
  545. #: ../../design/database.rst:492
  546. msgid "For single values, you can therefore write metadata as follows (taking the example of a date of birth attached to a user):"
  547. msgstr ""
  548. #: ../../design/database.rst:499
  549. msgid "For multiple values, you will need to iterate through and call ``create_metadata`` on each one. The following piece of code comes from the profile save action:"
  550. msgstr ""
  551. #: ../../design/database.rst:512
  552. msgid "Note that the *allow multiple* setting is set to *false* in the first iteration and *true* thereafter."
  553. msgstr ""
  554. #: ../../design/database.rst:518
  555. msgid "``elgg_get_metadata`` is the best function for retrieving metadata as ElggMetadata objects:"
  556. msgstr ""
  557. #: ../../design/database.rst:521
  558. msgid "E.g., to retrieve a user's DOB"
  559. msgstr ""
  560. #: ../../design/database.rst:530
  561. msgid "Or to get all metadata objects:"
  562. msgstr ""
  563. #: ../../design/database.rst:542
  564. msgid "Common mistakes"
  565. msgstr ""
  566. #: ../../design/database.rst:545
  567. msgid "\"Appending\" metadata"
  568. msgstr ""
  569. #: ../../design/database.rst:547
  570. msgid "Note that you cannot \"append\" values to metadata arrays as if they were normal php arrays. For example, the following will not do what it looks like it should do."
  571. msgstr ""
  572. #: ../../design/database.rst:556
  573. msgid "Trying to store hashmaps"
  574. msgstr ""
  575. #: ../../design/database.rst:558
  576. msgid "Elgg does not support storing ordered maps (name/value pairs) in metadata. For example, the following does not work as you might first expect it to:"
  577. msgstr ""
  578. #: ../../design/database.rst:567
  579. msgid "You can instead store the information like so:"
  580. msgstr ""
  581. #: ../../design/database.rst:576
  582. msgid "Storing GUIDs in metadata"
  583. msgstr ""
  584. #: ../../design/database.rst:578
  585. msgid "Though there are some cases to store entity GUIDs in metadata, `Relationships`_ are a much better construct for relating entities to each other."
  586. msgstr ""
  587. #: ../../design/database.rst:583
  588. msgid "Relationships"
  589. msgstr ""
  590. #: ../../design/database.rst:585
  591. msgid "Relationships allow you to bind entities together. Examples: an artist has fans, a user is a member of an organization, etc."
  592. msgstr ""
  593. #: ../../design/database.rst:588
  594. msgid "The class ``ElggRelationship`` models a directed relationship between two entities, making the statement:"
  595. msgstr ""
  596. #: ../../design/database.rst:591
  597. msgid "\"**{subject}** is a **{noun}** of **{target}**.\""
  598. msgstr ""
  599. #: ../../design/database.rst:594
  600. msgid "API name"
  601. msgstr ""
  602. #: ../../design/database.rst:594
  603. msgid "Models"
  604. msgstr ""
  605. #: ../../design/database.rst:596
  606. msgid "``guid_one``"
  607. msgstr ""
  608. #: ../../design/database.rst:596
  609. msgid "The subject"
  610. msgstr ""
  611. #: ../../design/database.rst:596
  612. msgid "Which entity is being bound"
  613. msgstr ""
  614. #: ../../design/database.rst:597
  615. msgid "``relationship``"
  616. msgstr ""
  617. #: ../../design/database.rst:597
  618. msgid "The noun"
  619. msgstr ""
  620. #: ../../design/database.rst:597
  621. msgid "The type of relationship"
  622. msgstr ""
  623. #: ../../design/database.rst:598
  624. msgid "``guid_two``"
  625. msgstr ""
  626. #: ../../design/database.rst:598
  627. msgid "The target"
  628. msgstr ""
  629. #: ../../design/database.rst:598
  630. msgid "The entity to which the subject is bound"
  631. msgstr ""
  632. #: ../../design/database.rst:601
  633. msgid "The type of relationship may alternately be a verb, making the statement:"
  634. msgstr ""
  635. #: ../../design/database.rst:603
  636. msgid "\"**{subject}** **{verb}** **{target}**.\""
  637. msgstr ""
  638. #: ../../design/database.rst:605
  639. msgid "E.g. User A \"likes\" blog post B"
  640. msgstr ""
  641. #: ../../design/database.rst:607
  642. msgid "**Each relationship has direction.** Imagine an archer shoots an arrow at a target; The arrow moves in one direction, binding the subject (the archer) to the target."
  643. msgstr ""
  644. #: ../../design/database.rst:611
  645. msgid "**A relationship does not imply reciprocity**. **A** follows **B** does not imply that **B** follows **A**."
  646. msgstr ""
  647. #: ../../design/database.rst:614
  648. msgid "**Relationships_ do not have access control.** They're never hidden from view and can be edited with code at any privilege level, with the caveat that *the entities* in a relationship may be invisible due to access control!"
  649. msgstr ""
  650. #: ../../design/database.rst:620
  651. msgid "Working with relationships"
  652. msgstr ""
  653. #: ../../design/database.rst:623
  654. msgid "Creating a relationship"
  655. msgstr ""
  656. #: ../../design/database.rst:625
  657. msgid "E.g. to establish that \"**$user** is a **fan** of **$artist**\" (user is the subject, artist is the target):"
  658. msgstr ""
  659. #: ../../design/database.rst:636
  660. msgid "This triggers the event [create, relationship], passing in the created ``ElggRelationship`` object. If a handler returns ``false``, the relationship will not be created and ``$success`` will be ``false``."
  661. msgstr ""
  662. #: ../../design/database.rst:642
  663. msgid "Verifying a relationship"
  664. msgstr ""
  665. #: ../../design/database.rst:644
  666. msgid "E.g. to verify that \"**$user** is a **fan** of **$artist**\":"
  667. msgstr ""
  668. #: ../../design/database.rst:652
  669. msgid "Note that, if the relationship exists, ``check_entity_relationship()`` returns an ``ElggRelationship`` object:"
  670. msgstr ""
  671. #: ../../design/database.rst:663
  672. msgid "Deleting a relationship"
  673. msgstr ""
  674. #: ../../design/database.rst:665
  675. msgid "E.g. to be able to assert that \"**$user** is no longer a **fan** of **$artist**\":"
  676. msgstr ""
  677. #: ../../design/database.rst:671
  678. msgid "This triggers the event [delete, relationship], passing in the associated ``ElggRelationship`` object. If a handler returns ``false``, the relationship will remain, and ``$was_removed`` will be ``false``."
  679. msgstr ""
  680. #: ../../design/database.rst:676
  681. msgid "Other useful functions:"
  682. msgstr ""
  683. #: ../../design/database.rst:678
  684. msgid "``delete_relationship()`` : delete by ID"
  685. msgstr ""
  686. #: ../../design/database.rst:679
  687. msgid "``remove_entity_relationships()`` : delete those relating to an entity (*note:* in versions before Elgg 1.9, this did not trigger delete events)"
  688. msgstr ""
  689. #: ../../design/database.rst:682
  690. msgid "Finding relationships and related entities"
  691. msgstr ""
  692. #: ../../design/database.rst:684
  693. msgid "Below are a few functions to fetch relationship objects and/or related entities. A few are listed below:"
  694. msgstr ""
  695. #: ../../design/database.rst:687
  696. msgid "``get_entity_relationships()`` : fetch relationships by subject or target entity"
  697. msgstr ""
  698. #: ../../design/database.rst:688
  699. msgid "``get_relationship()`` : get a relationship object by ID"
  700. msgstr ""
  701. #: ../../design/database.rst:689
  702. msgid "``elgg_get_entities_from_relationship()`` : fetch entities in relationships in a variety of ways"
  703. msgstr ""
  704. #: ../../design/database.rst:692
  705. msgid "E.g. retrieving users who joined your site in January 2014."
  706. msgstr ""
  707. #: ../../design/database.rst:706
  708. msgid "Access Control"
  709. msgstr ""
  710. #: ../../design/database.rst:708
  711. msgid "Granular access controls are one of the fundamental design principles in Elgg, and a feature that has been at the centre of the system throughout its development. The idea is simple: a user should have full control over who sees an item of data he or she creates."
  712. msgstr ""
  713. #: ../../design/database.rst:714
  714. msgid "Access controls in the data model"
  715. msgstr ""
  716. #: ../../design/database.rst:716
  717. msgid "In order to achieve this, every entity, annotation and piece of metadata contains an ``access_id`` property, which in turn corresponds to one of the pre-defined access controls or an entry in the ``access_collections`` database table."
  718. msgstr ""
  719. #: ../../design/database.rst:722
  720. msgid "Pre-defined access controls"
  721. msgstr ""
  722. #: ../../design/database.rst:724
  723. msgid "``ACCESS_PRIVATE`` (value: 0) Private."
  724. msgstr ""
  725. #: ../../design/database.rst:725
  726. msgid "``ACCESS_LOGGED_IN`` (value: 1) Logged in users."
  727. msgstr ""
  728. #: ../../design/database.rst:726
  729. msgid "``ACCESS_PUBLIC`` (value: 2) Public data."
  730. msgstr ""
  731. #: ../../design/database.rst:727
  732. msgid "``ACCESS_FRIENDS`` (value: -2) Owner and his/her friends."
  733. msgstr ""
  734. #: ../../design/database.rst:730
  735. msgid "User defined access controls"
  736. msgstr ""
  737. #: ../../design/database.rst:732
  738. msgid "You may define additional access groups and assign them to an entity, annotation or metadata. A number of functions have been defined to assist you; see the `access library reference`_ for more information."
  739. msgstr ""
  740. #: ../../design/database.rst:737
  741. msgid "How access affects data retrieval"
  742. msgstr ""
  743. #: ../../design/database.rst:739
  744. msgid "All data retrieval functions above the database layer - for example ``get_entities`` and its cousins - will only return items that the current user has access to see. It is not possible to retrieve items that the current user does not have access to. This makes it very hard to create a security hole for retrieval."
  745. msgstr ""
  746. #: ../../design/database.rst:748
  747. msgid "Write access"
  748. msgstr ""
  749. #: ../../design/database.rst:750
  750. msgid "The following rules govern write access:"
  751. msgstr ""
  752. #: ../../design/database.rst:752
  753. msgid "The owner of an entity can always edit it"
  754. msgstr ""
  755. #: ../../design/database.rst:753
  756. msgid "The owner of a container can edit anything therein (note that this does not mean that the owner of a group can edit anything therein)"
  757. msgstr ""
  758. #: ../../design/database.rst:755
  759. msgid "Admins can edit anything"
  760. msgstr ""
  761. #: ../../design/database.rst:757
  762. msgid "You can override this behaviour using a :ref:`plugin hook <design/events#plugin-hooks>` called ``permissions_check``, which passes the entity in question to any function that has announced it wants to be referenced. Returning ``true`` will allow write access; returning ``false`` will deny it. See :ref:`the plugin hook reference for permissions\\_check <guides/hooks-list#permission-hooks>` for more details."
  763. msgstr ""
  764. #: ../../design/database.rst:765
  765. msgid "`Access library reference`_"
  766. msgstr ""
  767. #: ../../design/database.rst:770
  768. msgid "Schema"
  769. msgstr ""
  770. #: ../../design/database.rst:772
  771. msgid "The database contains a number of primary tables and secondary tables. Its schema table is stored in ``/engine/schema/mysql.sql``."
  772. msgstr ""
  773. #: ../../design/database.rst:775
  774. msgid "Each table is prefixed by \"prefix\\_\", this is replaced by the Elgg framework during installation."
  775. msgstr ""
  776. #: ../../design/database.rst:779
  777. msgid "Main tables"
  778. msgstr ""
  779. #: ../../design/database.rst:781
  780. msgid "This is a description of the main tables. Keep in mind that in a given Elgg installation, the tables will have a prefix (typically \"elgg\\_\")."
  781. msgstr ""
  782. #: ../../design/database.rst:785
  783. msgid "Table: entities"
  784. msgstr ""
  785. #: ../../design/database.rst:787
  786. msgid "This is the main `Entities`_ table containing Elgg users, sites, objects and groups. When you first install Elgg this is automatically populated with your first site."
  787. msgstr ""
  788. #: ../../design/database.rst:791
  789. msgid "It contains the following fields:"
  790. msgstr ""
  791. #: ../../design/database.rst:793
  792. msgid "**guid** An auto-incrementing counter producing a GUID that uniquely identifies this entity in the system."
  793. msgstr ""
  794. #: ../../design/database.rst:795
  795. msgid "**type** The type of entity - object, user, group or site"
  796. msgstr ""
  797. #: ../../design/database.rst:796
  798. msgid "**subtype** A reference to the `entity_subtypes` table, or ``0`` for the default subtype."
  799. msgstr ""
  800. #: ../../design/database.rst:797
  801. msgid "**owner\\_guid** The GUID of the owner's entity."
  802. msgstr ""
  803. #: ../../design/database.rst:798
  804. msgid "**site\\_guid** The site the entity belongs to."
  805. msgstr ""
  806. #: ../../design/database.rst:799
  807. msgid "**container\\_guid** The GUID this entity is contained by - either a user or a group."
  808. msgstr ""
  809. #: ../../design/database.rst:801
  810. msgid "**access\\_id** Access controls on this entity."
  811. msgstr ""
  812. #: ../../design/database.rst:802
  813. msgid "**time\\_created** Unix timestamp of when the entity is created."
  814. msgstr ""
  815. #: ../../design/database.rst:803
  816. msgid "**time\\_updated** Unix timestamp of when the entity was updated."
  817. msgstr ""
  818. #: ../../design/database.rst:804
  819. msgid "**enabled** If this is 'yes' an entity is accessible, if 'no' the entity has been disabled (Elgg treats it as if it were deleted without actually removing it from the database)."
  820. msgstr ""
  821. #: ../../design/database.rst:809
  822. msgid "Table: entity\\_subtypes"
  823. msgstr ""
  824. #: ../../design/database.rst:811
  825. msgid "This table contains entity subtype information:"
  826. msgstr ""
  827. #: ../../design/database.rst:813
  828. #: ../../design/database.rst:823
  829. #: ../../design/database.rst:841
  830. msgid "**id** A counter."
  831. msgstr ""
  832. #: ../../design/database.rst:814
  833. msgid "**type** The type of entity - object, user, group or site."
  834. msgstr ""
  835. #: ../../design/database.rst:815
  836. msgid "**subtype** The subtype name as a string."
  837. msgstr ""
  838. #: ../../design/database.rst:816
  839. msgid "**class** Optional class name if this subtype is linked with a class"
  840. msgstr ""
  841. #: ../../design/database.rst:819
  842. msgid "Table: metadata"
  843. msgstr ""
  844. #: ../../design/database.rst:821
  845. msgid "This table contains `Metadata`_, extra information attached to an entity."
  846. msgstr ""
  847. #: ../../design/database.rst:824
  848. #: ../../design/database.rst:842
  849. msgid "**entity\\_guid** The entity this is attached to."
  850. msgstr ""
  851. #: ../../design/database.rst:825
  852. msgid "**name\\_id** A link to the metastrings table defining the name table."
  853. msgstr ""
  854. #: ../../design/database.rst:827
  855. #: ../../design/database.rst:845
  856. msgid "**value\\_id** A link to the metastrings table defining the value."
  857. msgstr ""
  858. #: ../../design/database.rst:828
  859. #: ../../design/database.rst:846
  860. msgid "**value\\_type** The value class, either text or an integer."
  861. msgstr ""
  862. #: ../../design/database.rst:829
  863. #: ../../design/database.rst:847
  864. msgid "**owner\\_guid** The owner GUID of the owner who set this item of metadata."
  865. msgstr ""
  866. #: ../../design/database.rst:831
  867. #: ../../design/database.rst:849
  868. msgid "**access\\_id** An Access controls on this item of metadata."
  869. msgstr ""
  870. #: ../../design/database.rst:832
  871. #: ../../design/database.rst:850
  872. msgid "**time\\_created** Unix timestamp of when the metadata is created."
  873. msgstr ""
  874. #: ../../design/database.rst:833
  875. #: ../../design/database.rst:851
  876. msgid "**enabled** If this is 'yes' an item is accessible, if 'no' the item has been deleted."
  877. msgstr ""
  878. #: ../../design/database.rst:837
  879. msgid "Table: annotations"
  880. msgstr ""
  881. #: ../../design/database.rst:839
  882. msgid "This table contains `Annotations`_, this is distinct from `Metadata`_."
  883. msgstr ""
  884. #: ../../design/database.rst:843
  885. msgid "**name\\_id** A link to the metastrings table defining the type of annotation."
  886. msgstr ""
  887. #: ../../design/database.rst:855
  888. msgid "Table: relationships"
  889. msgstr ""
  890. #: ../../design/database.rst:857
  891. msgid "This table defines `Relationships`_, these link one entity with another."
  892. msgstr ""
  893. #: ../../design/database.rst:859
  894. msgid "**guid\\_one** The GUID of the subject entity."
  895. msgstr ""
  896. #: ../../design/database.rst:860
  897. msgid "**relationship** The type of the relationship."
  898. msgstr ""
  899. #: ../../design/database.rst:861
  900. msgid "**guid\\_two** The GUID of the target entity."
  901. msgstr ""
  902. #: ../../design/database.rst:864
  903. msgid "Table: objects\\_entity"
  904. msgstr ""
  905. #: ../../design/database.rst:866
  906. msgid "Extra information specifically relating to objects. These are split in order to reduce load on the metadata table and make an obvious difference between attributes and metadata."
  907. msgstr ""
  908. #: ../../design/database.rst:871
  909. msgid "Table: sites\\_entity"
  910. msgstr ""
  911. #: ../../design/database.rst:873
  912. msgid "Extra information specifically relating to sites. These are split in order to reduce load on the metadata table and make an obvious difference between attributes and metadata."
  913. msgstr ""
  914. #: ../../design/database.rst:878
  915. msgid "Table: users\\_entity"
  916. msgstr ""
  917. #: ../../design/database.rst:880
  918. msgid "Extra information specifically relating to users. These are split in order to reduce load on the metadata table and make an obvious difference between attributes and metadata."
  919. msgstr ""
  920. #: ../../design/database.rst:885
  921. msgid "Table: groups\\_entity"
  922. msgstr ""
  923. #: ../../design/database.rst:887
  924. msgid "Extra information specifically relating to groups. These are split in order to reduce load on the metadata table and make an obvious difference between attributes and metadata."
  925. msgstr ""
  926. #: ../../design/database.rst:892
  927. msgid "Table: metastrings"
  928. msgstr ""
  929. #: ../../design/database.rst:894
  930. msgid "Metastrings contain the actual string of metadata which is linked to by the metadata and annotations tables."
  931. msgstr ""
  932. #: ../../design/database.rst:897
  933. msgid "This is to avoid duplicating strings, saving space and making database lookups more efficient."
  934. msgstr ""
  935. #: ../../design/database.rst:900
  936. msgid "Core developers will place schema upgrades in ``/engine/schema/upgrades/*``."
  937. msgstr ""
  938. #: ../../design/events.rst:2
  939. msgid "Events and Plugin Hooks"
  940. msgstr ""
  941. #: ../../design/events.rst:11
  942. msgid "Elgg has an event system that can be used to replace or extend core functionality."
  943. msgstr ""
  944. #: ../../design/events.rst:14
  945. msgid "Plugins influence the system by creating handlers (`callables <http://php.net/manual/en/language.types.callable.php>`_ such as functions and methods) and registering them to handle two types of events: `Elgg Events`_ and `Plugin Hooks`_."
  946. msgstr ""
  947. #: ../../design/events.rst:18
  948. msgid "When an event is triggered, a set of handlers is executed in order of priority. Each handler is passed arguments and has a chance to influence the process. After execution, the \"trigger\" function returns a value based on the behavior of the handlers."
  949. msgstr ""
  950. #: ../../design/events.rst:24
  951. msgid "Elgg Events vs. Plugin Hooks"
  952. msgstr ""
  953. #: ../../design/events.rst:26
  954. msgid "The main differences between `Elgg Events`_ and `Plugin Hooks`_ are:"
  955. msgstr ""
  956. #: ../../design/events.rst:28
  957. msgid "Most Elgg events can be cancelled; unless the event is an \"after\" event, a handler that returns `false` can cancel the event, and no more handlers are called."
  958. msgstr ""
  959. #: ../../design/events.rst:31
  960. msgid "Plugin hooks cannot be cancelled; all handlers are always called."
  961. msgstr ""
  962. #: ../../design/events.rst:32
  963. msgid "Plugin hooks pass an arbitrary value through the handlers, giving each a chance to alter along the way."
  964. msgstr ""
  965. #: ../../design/events.rst:37
  966. msgid "Elgg Events"
  967. msgstr ""
  968. #: ../../design/events.rst:39
  969. msgid "Elgg Events are triggered when an Elgg object is created, updated, or deleted; and at important milestones while the Elgg framework is loading. Examples: a blog post being created or a user logging in."
  970. msgstr ""
  971. #: ../../design/events.rst:43
  972. msgid "Unlike `Plugin Hooks`_, *most Elgg events can be cancelled*, halting the execution of the handlers, and possibly cancelling an some action in the Elgg core."
  973. msgstr ""
  974. #: ../../design/events.rst:47
  975. msgid "Each Elgg event has a name and an object type (system, user, object, relationship name, annotation, group) describing the type of object passed to the handlers."
  976. msgstr ""
  977. #: ../../design/events.rst:52
  978. msgid "Before and After Events"
  979. msgstr ""
  980. #: ../../design/events.rst:54
  981. msgid "Some events are split into \"before\" and \"after\". This avoids confusion around the state of the system while in flux. E.g. Is the user logged in during the [login, user] event?"
  982. msgstr ""
  983. #: ../../design/events.rst:58
  984. msgid "Before Events have names ending in \":before\" and are triggered before something happens. Like traditional events, handlers can cancel the event by returning `false`."
  985. msgstr ""
  986. #: ../../design/events.rst:62
  987. msgid "After Events, with names ending in \":after\", are triggered after something happens. Unlike traditional events, handlers *cannot* cancel these events; all handlers will always be called."
  988. msgstr ""
  989. #: ../../design/events.rst:66
  990. msgid "Where before and after events are available, developers are encouraged to transition to them, though older events will be supported for backwards compatibility."
  991. msgstr ""
  992. #: ../../design/events.rst:71
  993. msgid "Elgg Event Handlers"
  994. msgstr ""
  995. #: ../../design/events.rst:73
  996. msgid "Elgg event handlers should have the following prototype:"
  997. msgstr ""
  998. #: ../../design/events.rst:88
  999. msgid "If the handler returns `false`, the event is cancelled, preventing execution of the other handlers. All other return values are ignored."
  1000. msgstr ""
  1001. #: ../../design/events.rst:92
  1002. msgid "Register to handle an Elgg Event"
  1003. msgstr ""
  1004. #: ../../design/events.rst:94
  1005. msgid "Register your handler to an event using ``elgg_register_event_handler``:"
  1006. msgstr ""
  1007. #: ../../design/events.rst:100
  1008. #: ../../design/events.rst:147
  1009. #: ../../design/events.rst:202
  1010. #: ../../design/events.rst:230
  1011. msgid "Parameters:"
  1012. msgstr ""
  1013. #: ../../design/events.rst:102
  1014. #: ../../design/events.rst:149
  1015. msgid "**$event** The event name."
  1016. msgstr ""
  1017. #: ../../design/events.rst:103
  1018. msgid "**$object_type** The object type (e.g. \"user\" or \"object\") or 'all' for all types on which the event is fired."
  1019. msgstr ""
  1020. #: ../../design/events.rst:105
  1021. #: ../../design/events.rst:206
  1022. msgid "**$handler** The callback of the handler function."
  1023. msgstr ""
  1024. #: ../../design/events.rst:106
  1025. #: ../../design/events.rst:207
  1026. msgid "**$priority** The priority - 0 is first and the default is 500."
  1027. msgstr ""
  1028. #: ../../design/events.rst:108
  1029. msgid "**Object** here does not refer to an ``ElggObject`` but rather a string describing any object in the framework: system, user, object, relationship, annotation, group."
  1030. msgstr ""
  1031. #: ../../design/events.rst:111
  1032. #: ../../design/events.rst:212
  1033. msgid "Example:"
  1034. msgstr ""
  1035. #: ../../design/events.rst:121
  1036. msgid "Trigger an Elgg Event"
  1037. msgstr ""
  1038. #: ../../design/events.rst:123
  1039. msgid "You can trigger a custom Elgg event using ``elgg_trigger_event``:"
  1040. msgstr ""
  1041. #: ../../design/events.rst:133
  1042. msgid "For events with ambiguous states, like logging in a user, you should use `Before and After Events`_ by calling ``elgg_trigger_before_event`` or ``elgg_trigger_after_event``. This makes it clear for the event handler what state to expect and which events can be cancelled."
  1043. msgstr ""
  1044. #: ../../design/events.rst:150
  1045. msgid "**$object_type** The object type (e.g. \"user\" or \"object\")."
  1046. msgstr ""
  1047. #: ../../design/events.rst:151
  1048. msgid "**$object** The object (e.g. an instance of ``ElggUser`` or ``ElggGroup``)"
  1049. msgstr ""
  1050. #: ../../design/events.rst:153
  1051. msgid "The function will return ``false`` if any of the selected handlers returned ``false`` and the event is stoppable, otherwise it will return ``true``."
  1052. msgstr ""
  1053. #: ../../design/events.rst:159
  1054. msgid "Plugin Hooks"
  1055. msgstr ""
  1056. #: ../../design/events.rst:161
  1057. msgid "Plugin Hooks provide a way for plugins to collaboratively determine or alter a value. For example, to decide whether a user has permission to edit an entity or to add additional configuration options to a plugin."
  1058. msgstr ""
  1059. #: ../../design/events.rst:165
  1060. msgid "A plugin hook has a value passed into the trigger function, and each handler has an opportunity to alter the value before it's passed to the next handler. After the last handler has completed, the final value is returned by the trigger."
  1061. msgstr ""
  1062. #: ../../design/events.rst:171
  1063. msgid "Plugin Hook Handlers"
  1064. msgstr ""
  1065. #: ../../design/events.rst:173
  1066. msgid "Plugin hook handlers should have the following prototype:"
  1067. msgstr ""
  1068. #: ../../design/events.rst:189
  1069. msgid "If the handler returns no value (or `null` explicitly), the plugin hook value is not altered. Otherwise the return value becomes the new value of the plugin hook. It will then be passed to the next handler as `$value`."
  1070. msgstr ""
  1071. #: ../../design/events.rst:194
  1072. msgid "Register to handle a Plugin Hook"
  1073. msgstr ""
  1074. #: ../../design/events.rst:196
  1075. msgid "Register your handler to a plugin hook using ``elgg_register_plugin_hook_handler``:"
  1076. msgstr ""
  1077. #: ../../design/events.rst:204
  1078. #: ../../design/events.rst:232
  1079. msgid "**$hook** The name of the plugin hook."
  1080. msgstr ""
  1081. #: ../../design/events.rst:205
  1082. #: ../../design/events.rst:233
  1083. msgid "**$type** The type of the hook or 'all' for all types."
  1084. msgstr ""
  1085. #: ../../design/events.rst:209
  1086. msgid "**Type** can vary in meaning. It may mean an Elgg entity type or something specific to the plugin hook name."
  1087. msgstr ""
  1088. #: ../../design/events.rst:221
  1089. msgid "Trigger a Plugin Hook"
  1090. msgstr ""
  1091. #: ../../design/events.rst:223
  1092. msgid "You can trigger a custom plugin hook using ``elgg_trigger_plugin_hook``:"
  1093. msgstr ""
  1094. #: ../../design/events.rst:234
  1095. msgid "**$params** Arbitrary data passed from the trigger to the handlers."
  1096. msgstr ""
  1097. #: ../../design/events.rst:235
  1098. msgid "**$value** The initial value of the plugin hook."
  1099. msgstr ""
  1100. #: ../../design/events.rst:237
  1101. msgid "The `$params` and `$value` arguments are reversed between the plugin hook handlers and trigger functions!"
  1102. msgstr ""
  1103. #: ../../design/events.rst:241
  1104. msgid "Unregister Event/Hook Handlers"
  1105. msgstr ""
  1106. #: ../../design/events.rst:243
  1107. msgid "The functions ``elgg_unregister_event_handler`` and ``elgg_unregister_plugin_hook_handler`` can be used to remove handlers already registered by another plugin or Elgg core. The parameters are in the same order as the registration functions, except there's no priority parameter."
  1108. msgstr ""
  1109. #: ../../design/events.rst:251
  1110. msgid "Anonymous functions or invokable objects cannot be unregistered, but dynamic method callbacks can be unregistered by giving the static version of the callback:"
  1111. msgstr ""
  1112. #: ../../design/events.rst:263
  1113. msgid "Even though the event handler references a dynamic method call, the code above will successfully remove the handler."
  1114. msgstr ""
  1115. #: ../../design/i18n.rst:2
  1116. msgid "Internationalization"
  1117. msgstr ""
  1118. #: ../../design/i18n.rst:4
  1119. msgid "Elgg 1.0+ departs from previous versions in that it uses a custom text array rather than gettext. This improves system performance and reliability of the translation system."
  1120. msgstr ""
  1121. #: ../../design/i18n.rst:7
  1122. msgid "TODO: more plz"
  1123. msgstr ""
  1124. #: ../../design/index.rst:2
  1125. msgid "Design Docs"
  1126. msgstr ""
  1127. #: ../../design/index.rst:4
  1128. msgid "Gain a deep understanding of how Elgg works and why it's built the way it is."
  1129. msgstr ""
  1130. #: ../../design/loggable.rst:2
  1131. msgid "Loggable"
  1132. msgstr ""
  1133. #: ../../design/loggable.rst:4
  1134. msgid "Loggable is an interface inherited by any class that wants events relating to its member objects to be saved to the system log. ``ElggEntity`` and ``ElggExtender`` both inherit ``Loggable``."
  1135. msgstr ""
  1136. #: ../../design/loggable.rst:6
  1137. msgid "Loggable defines several class methods that are used in saving to the default system log, and can be used to define your own (as well as for other purposes):"
  1138. msgstr ""
  1139. #: ../../design/loggable.rst:8
  1140. msgid "``getSystemLogID()`` Return a unique identifier for the object for storage in the system log. This is likely to be the object's GUID"
  1141. msgstr ""
  1142. #: ../../design/loggable.rst:9
  1143. msgid "``getClassName()`` Return the class name of the object"
  1144. msgstr ""
  1145. #: ../../design/loggable.rst:10
  1146. msgid "``getType()`` Return the object type"
  1147. msgstr ""
  1148. #: ../../design/loggable.rst:11
  1149. msgid "``getSubtype()`` Get the object subtype"
  1150. msgstr ""
  1151. #: ../../design/loggable.rst:12
  1152. msgid "``getObjectFromID($id)`` For a given ID, return the object associated with it"
  1153. msgstr ""
  1154. #: ../../design/loggable.rst:13
  1155. msgid "``getObjectOwnerGUID()`` Return the GUID of the owner of this object"
  1156. msgstr ""
  1157. #: ../../design/loggable.rst:16
  1158. msgid "Database details"
  1159. msgstr ""
  1160. #: ../../design/loggable.rst:18
  1161. msgid "The default system log is stored in the ``system_log`` :doc:`database table <database>`. It contains the following fields:"
  1162. msgstr ""
  1163. #: ../../design/loggable.rst:20
  1164. msgid "**id** - A unique numeric row ID"
  1165. msgstr ""
  1166. #: ../../design/loggable.rst:21
  1167. msgid "**object_id** - The GUID of the entity being acted upon"
  1168. msgstr ""
  1169. #: ../../design/loggable.rst:22
  1170. msgid "**object_class** - The class of the entity being acted upon (eg ElggObject)"
  1171. msgstr ""
  1172. #: ../../design/loggable.rst:23
  1173. msgid "**object_type** - The type of the entity being acted upon (eg object)"
  1174. msgstr ""
  1175. #: ../../design/loggable.rst:24
  1176. msgid "**object_subtype** - The subtype of the entity being acted upon (eg blog)"
  1177. msgstr ""
  1178. #: ../../design/loggable.rst:25
  1179. msgid "**event** - The event being logged (eg create or update)"
  1180. msgstr ""
  1181. #: ../../design/loggable.rst:26
  1182. msgid "**performed_by_guid** - The GUID of the acting entity (the user performing the action)"
  1183. msgstr ""
  1184. #: ../../design/loggable.rst:27
  1185. msgid "**owner_guid** - The GUID of the user which owns the entity being acted upon"
  1186. msgstr ""
  1187. #: ../../design/loggable.rst:28
  1188. msgid "**access_id** - The access restriction associated with this log entry"
  1189. msgstr ""
  1190. #: ../../design/loggable.rst:29
  1191. msgid "**time_created** - The UNIX epoch timestamp of the time the event took place"
  1192. msgstr ""
  1193. #: ../../design/security.rst:2
  1194. msgid "Security"
  1195. msgstr ""
  1196. #: ../../design/security.rst:4
  1197. msgid "Elgg’s approach to the various security issues common to all web applications."
  1198. msgstr ""
  1199. #: ../../design/security.rst:8
  1200. msgid "To report a potential vulnerability in Elgg, email security@elgg.org."
  1201. msgstr ""
  1202. #: ../../design/security.rst:15
  1203. msgid "Passwords"
  1204. msgstr ""
  1205. #: ../../design/security.rst:18
  1206. msgid "Password validation"
  1207. msgstr ""
  1208. #: ../../design/security.rst:20
  1209. msgid "The only restriction that Elgg places on a password is that it must be at least 6 characters long by default, though this may be changed in /engine/settings.php. Additional criteria can be added by a plugin by registering for the ``registeruser:validate:password`` plugin hook."
  1210. msgstr ""
  1211. #: ../../design/security.rst:23
  1212. msgid "Password salting"
  1213. msgstr ""
  1214. #: ../../design/security.rst:27
  1215. msgid "Elgg salts passwords with a unique 8 character random string. The salt is generated each time the password is set. The main security advantages of the salting are:"
  1216. msgstr ""
  1217. #: ../../design/security.rst:26
  1218. msgid "preventing anyone with access to the database from conducting a precomputed dictionary attack"
  1219. msgstr ""
  1220. #: ../../design/security.rst:27
  1221. msgid "preventing a site administration from noting users with the same password."
  1222. msgstr ""
  1223. #: ../../design/security.rst:30
  1224. msgid "Password hashing"
  1225. msgstr ""
  1226. #: ../../design/security.rst:32
  1227. msgid "The hashed password is computed using md5 from the user's password text and the salt."
  1228. msgstr ""
  1229. #: ../../design/security.rst:35
  1230. msgid "Password storage"
  1231. msgstr ""
  1232. #: ../../design/security.rst:37
  1233. msgid "The hashed password and the salt are stored in the users table. Neither are stored in any cookies on a user's computer."
  1234. msgstr ""
  1235. #: ../../design/security.rst:40
  1236. msgid "Password throttling"
  1237. msgstr ""
  1238. #: ../../design/security.rst:42
  1239. msgid "Elgg has a password throttling mechanism to make dictionary attacks from the outside very difficult. A user is only allowed 5 login attempts over a 5 minute period."
  1240. msgstr ""
  1241. #: ../../design/security.rst:45
  1242. msgid "Password resetting"
  1243. msgstr ""
  1244. #: ../../design/security.rst:47
  1245. msgid "If a user forgets his password, a new random password can be requested. After the request, an email is sent with a unique URL. When the user visits that URL, a new random password is sent to the user through email."
  1246. msgstr ""
  1247. #: ../../design/security.rst:50
  1248. msgid "Sessions"
  1249. msgstr ""
  1250. #: ../../design/security.rst:52
  1251. msgid "Elgg uses PHP's session handling with custom handlers. Session data is stored in the database. The session cookie contains the session id that links the user to the browser. The user's metadata is stored in the session including GUID, username, email address. The session's lifetime is controlled through the server's PHP configuration."
  1252. msgstr ""
  1253. #: ../../design/security.rst:55
  1254. msgid "Session fixation"
  1255. msgstr ""
  1256. #: ../../design/security.rst:56
  1257. msgid "Elgg protects against session fixation by regenerating the session id when a user logs in."
  1258. msgstr ""
  1259. #: ../../design/security.rst:59
  1260. msgid "Session hijacking"
  1261. msgstr ""
  1262. #: ../../design/security.rst:60
  1263. msgid "This section is questionable."
  1264. msgstr ""
  1265. #: ../../design/security.rst:62
  1266. msgid "Besides protecting against session fixation attacks, Elgg also has a further check to try to defeat session hijacking if the session identifier is compromised. Elgg stores a hash of the browser's user agent and a site secret as a session fingerprint. The use of the site secret is rather superfluous but checking the user agent might prevent some session hijacking attempts."
  1267. msgstr ""
  1268. #: ../../design/security.rst:65
  1269. msgid "“Remember me” cookie"
  1270. msgstr ""
  1271. #: ../../design/security.rst:66
  1272. msgid "To allow users to stay logged in for a longer period of time regardless of whether the browser has been closed, Elgg uses a cookie (called elggperm) that contains what could be considered a super session identifier. This identifier is stored in a cookies table. When a session is being initiated, Elgg checks for the presence of the elggperm cookie. If it exists and the session code in the cookie matches the code in the cookies table, the corresponding user is automatically logged in."
  1273. msgstr ""
  1274. #: ../../design/security.rst:69
  1275. msgid "Alternative authentication"
  1276. msgstr ""
  1277. #: ../../design/security.rst:71
  1278. msgid "This section is very hand-wavy"
  1279. msgstr ""
  1280. #: ../../design/security.rst:73
  1281. msgid "To replace Elgg's default user authentication system, a plugin would have to replace the default action with its own through ``register_action()``. It would also have to register its own pam handler using ``register_pam_handler()``."
  1282. msgstr ""
  1283. #: ../../design/security.rst:75
  1284. msgid "The ``pam_authenticate()`` function used to call the different modules has a bug related to the importance variable."
  1285. msgstr ""
  1286. #: ../../design/security.rst:79
  1287. msgid "HTTPS"
  1288. msgstr ""
  1289. #: ../../design/security.rst:81
  1290. msgid "You must enable SSL support on your server for any of these techniques to work."
  1291. msgstr ""
  1292. #: ../../design/security.rst:83
  1293. msgid "To make the login form submit over https, turn on login-over-ssl from Elgg’s admin panel."
  1294. msgstr ""
  1295. #: ../../design/security.rst:85
  1296. msgid "You can also serve your whole site over SSL by simply changing the site URL to include “https” instead of just “http.”"
  1297. msgstr ""
  1298. #: ../../design/security.rst:88
  1299. msgid "XSS"
  1300. msgstr ""
  1301. #: ../../design/security.rst:90
  1302. msgid "Filtering is used in Elgg to make XSS attacks more difficult. The purpose of the filtering is to remove Javascript and other dangerous input from users."
  1303. msgstr ""
  1304. #: ../../design/security.rst:92
  1305. msgid "Filtering is performed through the function ``filter_tags()``. This function takes in a string and returns a filtered string. It triggers a ``validate, input`` plugin hook."
  1306. msgstr ""
  1307. #: ../../design/security.rst:94
  1308. msgid "By default Elgg comes with the htmLawed filtering code as a plugin. Developers can drop in any additional or replacement filtering code as a plugin."
  1309. msgstr ""
  1310. #: ../../design/security.rst:96
  1311. msgid "The ``filter_tags()`` function is called on any user input as long as the input is obtained through a call to ``get_input()``. If for some reason a developer did not want to perform the default filtering on some user input, the ``get_input()`` function has a parameter for turning off filtering."
  1312. msgstr ""
  1313. #: ../../design/security.rst:99
  1314. msgid "CSRF / XSRF"
  1315. msgstr ""
  1316. #: ../../design/security.rst:101
  1317. msgid "Elgg generates security tokens to prevent `cross-site request forgery`_. These are embedded in all forms and state-modifying AJAX requests as long as the correct API is used. Read more in the :doc:`/guides/actions` developer guide."
  1318. msgstr ""
  1319. #: ../../design/security.rst:104
  1320. msgid "SQL Injection"
  1321. msgstr ""
  1322. #: ../../design/security.rst:106
  1323. msgid "Elgg’s API sanitizes all input before issuing DB queries. Read more in the :doc:`/design/database` design doc."
  1324. msgstr ""
  1325. #: ../../design/security.rst:109
  1326. msgid "Privacy"
  1327. msgstr ""
  1328. #: ../../design/security.rst:111
  1329. msgid "Elgg uses an ACL system to control which users have access to various pieces of content. Read more in the :doc:`/design/database` design doc."
  1330. msgstr ""