The following has evaluated to null or missing: ==> FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale ) [in template "252001#252047#252845" at line 128, column 37] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: dMTJsonObject = FrontendService.media... [in template "252001#252047#252845" at line 128, column 21] ----
1<#-- used @ Veranstaltung-Detailseite Intro
2 used @ Publikation-Detailseite Intro
3-->
4
5<#--
6Web content templates to display teaser on thema detail page
7
8Generic template for detail pages Intro / Teaser element
9-->
10<#--
11Display the current page title
12-->
13<#include "${fullTemplatesPath}/functions/relatedContentUtil.ftl" />
14<#include "${fullTemplatesPath}/macros/debugging.ftl" />
15
16<#include "${fullTemplatesPath}/macros/page-modules/PMIntro.ftl" />
17<#include "${fullTemplatesPath}/macros/atomic-modules/AMPublicationCarousel.ftl" />
18<#include "${fullTemplatesPath}/macros/atomic-modules/AMMetadata.ftl" />
19<#include "${fullTemplatesPath}/macros/atomic-modules/AMDatetime.ftl" />
20
21
22<#--
23 renders the Intro for nearly all Pages
24 TODO: remove Share? (was in the designs, but not anymore?)
25 TODO: check if languageSelect/filter are working (js)
26
27 - portletId
28 - data = {
29 "media": string (src from image),
30 "category": string,
31 "title": string,
32 "author": string,
33 "subheadline": string,
34 "copy": string,
35 "filter": {
36 "id": string,
37 "name": string,
38 "entries": Array<Object> ({key:value}),
39 },
40 "languageSelect": {
41 "id": string,
42 "name": string,
43 "entries": Array<Object> ({key:value}),
44 },
45 "meta": {
46 "pos"; string (top/bottom)
47 "date": string,
48 "hash": string,
49 "info": string, (url)
50 },
51 "share" : {
52 "login": string,
53 "print": string,
54 "mail": string,
55 "multishare": string?? (tbd)
56 }
57 - AMMetadata: macro
58 - position: String ("top") -> defines wether the meta-data should be rendered above or below the intro-content
59 }
60-->
61
62<#assign
63 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
64
65 ServiceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext()
66 DLAPP = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService")
67
68 themeDisplay = ServiceContext.getThemeDisplay()
69 editmode = FrontendService.user.isPrivilegedUser(themeDisplay)
70
71 languageId = themeDisplay.getLocale()
72 groupId = themeDisplay.getScopeGroupId()
73 currentUrl = themeDisplay.getURLCurrent()
74
75 layout = themeDisplay.getLayout()
76 layouttpl = layout.getTypeSettingsProperties().getProperty("layout-template-id")
77/>
78
79<#setting locale="${languageId}">
80
81<#-- get article from url -->
82
83<#assign entry = FrontendService.article.getArticleToUrl(currentUrl, groupId?number)! >
84
85
86<#if entry?has_content>
87
88 <#if entry.resourcePrimKey??>
89 <#assign primaryKey = entry.resourcePrimKey?number >
90 <#elseif entry.classPK??>
91 <#assign primaryKey = entry.classPK?number >
92 </#if>
93
94 <#assign
95 jsonString = FrontendService.article.getWebcontent(primaryKey)
96 json = FrontendService.json.parseAsJson(jsonString)
97 availablelanguages = FrontendService.article.getAssetEntryToUrl(primaryKey).getAvailableLanguageIds()
98
99 title = entry.getTitle(languageId)
100 data = {
101 "title": title
102 }
103 />
104 <@debugJsonString jsonString "ADT_KASDE_DYNAMIC_INTRO" />
105
106 <#if hasContent('untertitel', languageId, json)>
107 <#assign data = data + { "subheadline": getValueForLanguage('untertitel', languageId, json, "first") } >
108 </#if>
109
110 <#if hasContent('beschreibung', languageId, json)>
111 <#assign data = data + { "copy": getValueForLanguage('beschreibung', languageId, json, "first") } >
112 </#if>
113
114 <#-- fill meta data -->
115 <#assign meta = {} />
116
117 <#-- PUBLIKATIONEN DETAIL -->
118 <#if layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL")>
119
120 <#if hasContent('coverDMTKASDEMEDIUM', languageId, json)>
121 <#assign
122 coverBildString = getValueForLanguage('coverDMTKASDEMEDIUM', languageId, json, "first")
123 />
124
125 <#if coverBildString?has_content>
126 <#assign
127 coverBild = FrontendService.json.parseAsJson(coverBildString)
128 dMTJsonObject = FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale )
129 linkToDMT = FrontendService.media.getImageURLForAMConfiguration('hd-resolution',coverBild.groupId?number, coverBild.uuid )
130 data = data + { "media": linkToDMT, "meta" : dMTJsonObject }
131 />
132 <#if dMTJsonObject.altText?? >
133 <#assign data = data + {"alt" : dMTJsonObject.altText} />
134 </#if>
135 <#if dMTJsonObject.quelle??>
136 <#assign meta = meta + { "quelle": dMTJsonObject.quelle } />
137 </#if>
138 </#if>
139 <#-- uncomment to display pdf cover as Intro Image
140 <#elseif hasContent('document_pdfDMTBASICDOCUMENT', languageId, json)>
141 <#assign
142 pdfDocument = getValueForLanguage('document_pdfDMTBASICDOCUMENT', languageId, json, "first")
143 fileEntry = FrontendService.media.getFileEntry(pdfDocument.uuid, groupId?number)!/>
144 <#if fileEntry?has_content>
145 <#assign
146 linkToThumbnail = FrontendService.link.getThumbnailSrc(fileEntry , themeDisplay)
147 data = data + { "media": linkToThumbnail }
148 />
149 </#if>
150 -->
151 </#if>
152
153 <#assign
154 meta = meta + { "orderInfo": "true" }
155 verbundJournalArticle = FrontendService.publication.getVerbundToPublikation( entry )!""
156 />
157
158
159
160 <#if hasContent('erscheinungsdatum', languageId, json)>
161 <#assign
162 erscheinungsdatum = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
163 />
164 <#if erscheinungsdatum?has_content >
165 <#assign
166 erscheinungsdatumFormatted = FrontendService.date.getDateFormatLong( erscheinungsdatum, languageId )
167 meta = meta + { "date": erscheinungsdatumFormatted }
168 />
169 </#if>
170 </#if>
171
172 <#if verbundJournalArticle?has_content>
173 <#assign
174 verbundJsonString = FrontendService.article.getWebcontent(verbundJournalArticle.resourcePrimKey)
175 verbundJson = FrontendService.json.parseAsJson(verbundJsonString)
176 laufendenummer = getValueForLanguage('laufendenummer', languageId, verbundJson, "first")
177 coverImg = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, verbundJson, "first")
178 />
179 <@debugJsonString verbundJsonString "ADT_KASDE_DYNAMIC_INTRO-verbundJournalArticle" />
180 <#assign meta = meta + { "laufendenummer": laufendenummer } >
181
182 <#if coverImg?has_content && coverImg.url?has_content >
183 <#assign meta = meta + { "coverImg": coverImg.url } >
184 </#if>
185 </#if>
186
187
188 <#if meta?has_content>
189 <#assign data = data + {"meta": meta } >
190 </#if>
191
192 </#if>
193 <#-- PUBLIKATIONEN DETAIL END -->
194
195
196 <#-- VERANSTALTUNGEN DETAIL -->
197 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL")>
198 <#assign
199 friendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, languageId, groupId)!""
200 links = []
201 />
202 <#if availablelanguages?has_content && friendlyUrl?has_content>
203 <#if (availablelanguages?size > 1) >
204 <#list availablelanguages as language>
205 <#assign
206 defaultLanguage = "de_DE"
207 defaultLocale = FrontendService.language.getLocaleByKey(defaultLanguage)
208 linkLocale = (FrontendService.language.getLocaleByKey(language))!defaultLocale
209 langFriendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, linkLocale, groupId)
210
211 link = {
212 "key": language!defaultLanguage,
213 "value": linkLocale.getDisplayLanguage(languageId),
214 "url": "/c/portal/update_language?p_l_id=" +
215 layout.plid + "&redirect=" + langFriendlyUrl +
216 "&languageId=" + language
217 }
218 />
219 <#if language == languageId>
220 <#assign link = link + { "selected": "true" } >
221 </#if>
222 <#assign links = links + [link]>
223 </#list>
224 <#assign
225 data = data + {
226 "languageSelect": {
227 "id": "languageSelectRedirect",
228 "name": "languageselectRedirect",
229 "entries": links,
230 "label": languageUtil.get(languageId, "diese.veranstaltung.ist.in.weiteren.sprachen.verfuegbar")
231 }
232 }
233 />
234 </#if>
235 </#if>
236 </#if>
237
238 <#if hasContent('erscheinungsdatum', languageId, json)>
239 <#assign
240 startdate = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
241 meta = meta + { "start": startdate?date.iso, "end": "" }
242 />
243 </#if>
244
245 <#if hasContent('startdatum', languageId, json)>
246 <#assign
247 startdate = getValueForLanguage('startdatum', languageId, json, "first")
248 meta = meta + { "start": startdate?date.iso, "end": "" }
249 />
250 </#if>
251
252 <#if hasValue('einfuehrungText', locale, json)>
253 <#assign data = data + { "einfuehrungText" : getValueForLanguage('einfuehrungText', locale, json, "first") } >
254 <#elseif hasValue(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first")>
255 <#assign data = data + { "einfuehrungText" : getValueForLanguage(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first") } >
256 </#if>
257
258 <#if hasContent('endedatum', languageId, json)>
259 <#assign
260 enddate = getValueForLanguage('endedatum', languageId, json, "first")
261 meta = meta + { "end": enddate?date.iso }
262 />
263 </#if>
264
265 <#if hasContent('startzeit', languageId, json)>
266 <#assign
267 startzeit = getValueForLanguage('startzeit', languageId, json, "first")
268 />
269 <#if startzeit?has_content >
270 <#assign meta = meta + { "startzeit": startzeit } />
271 </#if>
272 </#if>
273
274 <#if hasContent('endezeit', languageId, json)>
275 <#assign
276 endezeit = getValueForLanguage('endezeit', languageId, json, "first")
277 meta = meta + { "endezeit": endezeit }
278 />
279 </#if>
280
281 <#if hasContent('ortWCSKASDEORT', languageId, json)>
282 <#assign
283 ortWCSKASDEORT = FrontendService.json.parseAsJson(getValueForLanguage('ortWCSKASDEORT', languageId, json, "first"))
284 ortWCSKASDEORTPrimaryKey = ortWCSKASDEORT.classPK?number
285 ortWCSKASDEORTWebContent = FrontendService.article.getWebcontentByPk(ortWCSKASDEORTPrimaryKey)!""
286 />
287 <#if ortWCSKASDEORTWebContent?has_content >
288 <#assign
289 ortWCSKASDEORTTitle = ortWCSKASDEORTWebContent.getTitle(languageId)!""
290 />
291 <#if ortWCSKASDEORTTitle?has_content >
292 <#assign
293 meta = meta + { "ortWCSKASDEORT": ortWCSKASDEORTTitle }
294 />
295 </#if>
296 </#if>
297 </#if>
298
299
300 <#if hasContent('veranstaltungsnummer', languageId, json)>
301 <#assign
302 verauuid = getValueForLanguage('veranstaltungsnummer', languageId, json, "first")
303 meta = meta + { "verauuid": verauuid }
304 />
305 </#if>
306
307
308 <#if (data.meta)?has_content >
309 <#assign meta = data.meta />
310 </#if>
311
312 <#if !(data.media)?has_content && hasContent('mediumDMTKASDEMEDIUM', languageId, json)>
313 <#assign
314 medium = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, json, "first")
315 mediaData = getRelatedMediaObject(medium, themeDisplay, languageId, FrontendService, "hd-resolution")
316 />
317 <#assign data = data + { "media": mediaData.url , "meta" : mediaData.meta} >
318
319
320 <#if mediaData.meta?? && mediaData.meta.quelle??>
321 <#assign meta = meta + data.meta + { "quelle": mediaData.meta.quelle } />
322 </#if>
323 </#if>
324
325
326 <#if meta?has_content>
327 <#assign data = data + {"meta": meta } >
328 </#if>
329
330 <#-- END fill meta data -->
331
332 <#if hasContentForSequence('autorenWCSKASDEPERSON', languageId, json)>
333 <#assign
334 journalArticles = getValueForLanguageAnsprechpartner('autorenWCSKASDEPERSON', languageId, json)
335 authors = []
336 />
337 <#list journalArticles as articleString>
338 <#assign article = FrontendService.json.parseAsJson(articleString) />
339 <#if article?has_content && article?is_hash && article.classPK??>
340 <#assign articleDereferenced = FrontendService.person.resolveContactInstanceToPerson(article, languageId)!"" />
341 <#if articleDereferenced?has_content >
342 <#assign
343 author = ""
344 articlePrimaryKey = articleDereferenced.classPK?number
345 articleJsonString = FrontendService.article.getWebcontent(articlePrimaryKey)
346 articleJson = FrontendService.json.parseAsJson(articleJsonString)
347 />
348 <@debugJsonString articleJsonString "ADT_KASDE_DYNAMIC_INTRO-autorenWCSKASDEPERSON" />
349 <#if hasValue('anredetitel', languageId, articleJson)>
350 <#assign author = author + getValueForLanguage('anredetitel', languageId, articleJson, " ") + " ">
351 </#if>
352 <#if hasValue('vorname', languageId, articleJson)>
353 <#assign author = author + getValueForLanguage('vorname', languageId, articleJson, " ") + " ">
354 </#if>
355 <#if hasValue('nachname', languageId, articleJson)>
356 <#assign author = author + getValueForLanguage('nachname', languageId, articleJson, " ") + " ">
357 </#if>
358
359 <#attempt>
360 <#assign href = FrontendService.article.getFriendlyUrl(articlePrimaryKey, languageId, groupId)!"#" >
361 <#recover>
362 <#assign href = "#" >
363 </#attempt>
364 <#if href?has_content && href != "#" && href != "/_404">
365 <#assign author = '<a href="' + href + '">' + author?trim + '</a>'>
366 </#if>
367
368 <#assign authors = authors + [author?trim]>
369 </#if>
370 </#if>
371 </#list>
372 <#if authors?has_content>
373 <#assign data = data + { "author": authors?join(", ") } >
374 </#if>
375 </#if>
376
377 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL") >
378 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "VERANSTALTUNGSTYP")! >
379 <#if categories?has_content && categories[0]?has_content >
380 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
381 </#if>
382
383 <#if hasContent('ausgebucht', languageId, json)>
384 <#assign data = data + { "ausgebucht" : getValueForLanguage('ausgebucht', languageId, json, "first") }>
385 </#if>
386
387 <#if hasContent('storniert', languageId, json)>
388 <#assign data = data + { "storniert" : getValueForLanguage('storniert', languageId, json, "first") }>
389 </#if>
390
391 <#elseif layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL") >
392 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "PUBLIKATIONSREIHE")! >
393 <#if categories?has_content && categories[0]?has_content >
394 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
395 </#if>
396 <#else>
397 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "THEMA")! >
398 <#if categories?has_content && categories[0]?has_content >
399 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
400 </#if>
401 </#if>
402
403
404 <#assign
405 languages = []
406 />
407
408 <#attempt>
409 <#if json["document_pdfDMTBASICDOCUMENT"]?? >
410 <#if availablelanguages?has_content>
411 <#list availablelanguages as pdf_language>
412 <#assign
413 docRefJson = getValueForLanguage('document_pdfDMTBASICDOCUMENT', pdf_language, json, "first")
414 docRef = FrontendService.json.parseAsJson(docRefJson)
415 />
416 <#if docRef?is_hash && pdf_language != languageId >
417 <#assign
418 lang = FrontendService.language.getLocaleByKey(pdf_language)!""
419 docGroupId = docRef["groupId"]?number
420 docUuid = docRef["uuid"]
421 dMTJsonObject = FrontendService.media.getDMTJsonObject( docGroupId, docUuid, locale )
422 dMTLink = FrontendService.media.getLinkToDMT( dMTJsonObject )
423 />
424 <#if lang?has_content>
425 <#assign
426 languages = languages + [
427 {
428 "key": pdf_language,
429 "value": FrontendService.language.getLocaleByKey(pdf_language).getDisplayLanguage(),
430 "url": dMTLink
431 }]
432 />
433 </#if>
434 </#if>
435 </#list>
436 </#if>
437 </#if>
438 <#recover>
439 </#attempt>
440
441 <#if (languages?size > 0)>
442 <#attempt>
443 <#assign
444 data = data + { "languageSelect": {
445 "id": "languageSelect",
446 "name": "languageselect",
447 "entries": languages,
448 "documents": "",
449 "button": "true"
450 }}
451 />
452 <#recover>
453 </#attempt>
454 </#if>
455
456 <@PMIntro "ADT_KASDE_DYNAMIC_INTRO" data AMMetadata AMDatetime "bottom" />
457 ${FrontendService.article.getEditArticleHtml(primaryKey, themeDisplay)}
458
459 <#if data.meta?has_content>
460 <#if data.meta.laufendenummer?has_content !isACColorScheme() && !isVLCColorScheme() && !isDPMColorScheme()>
461 <div>
462 <div id="publicationVerbundPagination">
463 <@AMPublicationCarousel data.meta.laufendenummer data.meta.date data.meta.coverImg />
464 </div>
465 </div>
466 </#if>
467 </#if>
468
469<#elseif (editmode?? && editmode)>
470 <@errorMessage languageUtil.get(locale, "kein.journalArticle.gefunden") "ADT_KASDE_DYNAMIC_INTRO" layouttpl currentUrl />
471</#if>
Kommunalwahlen in Kambodscha
Am 5. Juni fanden die Kommunalwahlen in Kambodschas 25 Provinzen statt. Hierbei konnten die 9,2 Millionen registrierten Wahlberechtigten in 1.652 Kommunen über ihre künftigen Gemeinderäte beziehungsweise deren Partei abstimmen. Es sind die fünften Kommunalwahlen seit 1993. Wie viele Sitze in jedem Gemeinderat zu vergeben sind, hängt dabei von der Größe der Kommune ab. Im ganzen Land standen mehr als 80.000 Kandidaten aus 17 verschiedenen Parteien zur Wahl. Die Wahlen bestimmen für die nächsten fünf Jahre die kommunalen Verantwortlichen, also den jeweiligen Gemeinderat und den Bürgermeister.
Hintergrund: Aktuelle politische Situation
Die diesjährigen Wahlen sind besonders relevant, wenn man sich die jüngeren politischen Entwicklungen Kambodschas vor Augen führt. Denn seit den letzten Kommunalwahlen 2017 hat sich viel in Kambodschas Parteienlandschaft geändert. Damals konnte die größte Oppositionspartei CNRP 43,8% der Stimmen auf kommunaler Ebene holen und damit ein für die Regierungspartei CPP gefährliches Ergebnis einfahren. 2017 folgte schließlich die politisch motivierte Auflösung der CNRP durch den Obersten Gerichtshof und eine fünfjährige politische Sperre für 118 CNRP-Funktionäre. Seitdem ist Kambodscha de facto ein Einparteienstaat. Ohne Opposition gewann die CPP 2018 alle 125 Sitze in der Nationalversammlung. Zudem hält sie derzeit 58 von 62 Sitzen im Senat und übernahm den Großteil der nach dem Verbot aufzuteilenden Sitze der CNRP in den Gemeinderäten. Diese Entwicklung hatte viele Debatten in der internationalen Gemeinschaft ausgelöst und die Frage aufgeworfen, ob Kambodscha zur Autokratie zurückkehrt. Durch das Verbot der CNRP wurden die Wahlen international nicht als legitim angesehen. Die Europäische Union hat beispielsweise, mit dem Entzug von Handelspräferenzen im Rahmen des EBA-Handelsschemas (Everything but Arms) reagiert. Aus diesem Grund wurden die diesjährigen Kommunalwahlen mit Spannung erwartet, denn es stellte sich die Frage, ob es bei der Einparteienherrschaft bleibt oder ob sich wieder eine Opposition etabliert.
Relevante Parteien und politische Figuren
Die Regierungspartei CPP stand als einzige Partei in allen Kommunen zur Wahl. Sie warb mit der Aufrechterhaltung von Frieden, Sicherheit und Ordnung. Nicht überraschend betonte Premierminister Hun Sen die Entwicklung Kambodschas unter der Führung der CPP seit dem Fall der Khmer Rouge vor 43 Jahren.[i] Hun Sen regiert Kambodscha seit 1985 und ist auch Präsident der CPP. Für die Kommunen verspricht die Regierungspartei bessere Lebensgrundlagen, den Ausbau von Infrastruktur und mehr Ausgaben aus dem nationalem Budget für kommunale Entwicklungsprojekte.[ii] Viele Kambodschaner schätzen zudem, wie die Regierung das Land durch die Pandemie geführt hat.
Als größte Oppositionspartei und zweitgrößte Partei im Land trat die Candlelight Party (CP) in 1.623 der 1.652 Kommunen zur Wahl an. Sie verspricht Bildung für alle Kambodschaner, Unterstützung für Privatleute bei der Rückzahlung von Krediten und eine korruptionsfreie Politik.[iii] Ausschlaggebend ist, dass die CP einige ehemalige CNRP-Mitglieder vereinen konnte und heute von einigen Wählern als deren Nachfolgepartei betrachtet wird. Schließlich entstammt die CP der Sam Rainsy Partei (SRP), die sich 2012 mit Kem Sokhas Menschenrechtspartei zur so erfolgreichen CNRP zusammengeschlossen hatte. Seit 2018 trägt die SRP den Namen Candlelight Party, da ihr ehemaliger Anführer Sam Rainsy heute gerichtlich verfolgt wird und im Exil lebt. Obwohl Rainsy und die Candlelight Party heute in öffentlichen Verlautbarungen Distanz wahren, setzte die Candlelight Party darauf, die Stimmen ehemaliger CNRP Wähler zu gewinnen.[iv]
Allerdings ist der Nachfolgeanspruch nicht eindeutig. Denn die Einigkeit zwischen den beiden ehemaligen CNRP-Anführern Sam Rainsy und Kem Sokha, die den Wahlerfolg der CNRP 2017 ermöglicht hatte, ist heute längst verflogen. Gegen Kem Sokha läuft seit fünf Jahren ein immer wieder verzögerter Prozess wegen Hochverrats. Er unterstützt daher offiziell keine Partei und beschuldigt seinen ehemaligen Partner Rainsy, seinen Namen für politische Zwecke zu missbrauchen. Am Streit der damaligen CNRP-Anführer spaltet sich heute die Opposition. Auch sechs weitere Parteien haben sich um ehemalige CNRP-Funktionäre und Mitglieder gebildet.[v] Die Zersplitterung der Opposition hat zur Folge, dass viele Parteien nur in wenigen Kommunen zur Wahl standen. Denn das Gesetz erfordert, dass auf jeder Wahlliste doppelt so viele Kandidaten wie die Anzahl der verfügbaren Sitze im Gemeinderat präsentiert werden müssen. Dies ist ein Hindernis für kleine Parteien, die Probleme bei der Rekrutierung ausreichender Kandidaten hatten.[vi]
Wahlergebnis und Wahlbeteiligung
Der Regierungspartei CPP gelang in den Kommunalwahlen ein Erdrutschsieg. Auf kommunaler Ebene konnte sie 73 Prozent der Wählerstimmen und damit über 9.000 Sitze in Gemeinderäten für sich gewinnen. In den nächsten fünf Jahren stellt die CPP fast alle Bürgermeister, in 1.648 der 1.652 Kommunen. Somit hat sie Kambodschas Politik weiter fest im Griff.
Im Gegensatz dazu blieb die Candlelight Party hinter ihren Erwartungen zurück. Diese konnte 22 Prozent der Stimmanteile, entsprechend 2.176 Sitzen in den Gemeinderäten gewinnen. Allerdings hatte sie hinsichtlich der Posten als Bürgermeister kaum Chancen, nur in vier Kommunen gewann sie die dafür nötige Mehrheit der Gemeinderäte. Für die CPP ist die Candlelight Party daher noch keine ernste Gefahr. Trotzdem zeigen die Kommunalwahlen, dass sich die Opposition seit der Auflösung der CNRP hin zur Candlelight Party konsolidiert hat. National irrelevant bleiben die weiteren 15 Oppositionsparteien, die keinen Posten als Bürgermeister gewinnen konnten und gemeinsam nur drei Prozent der Wählerstimmen erreichten. Dies zeigt, dass Kambodscha von einem funktionierenden Mehrparteiensystem weit entfernt ist.
Die Wahlbeteiligung betrug 77,91 Prozent und ist damit im Vergleich zu den letzten Kommunalwahlen 2017 mit 89,52 Prozent gesunken. Der Vorsitzende der Nationalen Wahlkommission Prach Chan begründete dies mit schlechtem Wetter und der Tatsache, dass im Ausland lebende Kambodschaner nicht wählen gehen konnten.[vii] Dies ist allerdings kaum ein Argument, schließlich bestand die Problematik mit den thailändischen Arbeitsmigranten auch bei den letzten Kommunalwahlen.[viii] Eher wohl zeigt der Rückgang in der Wahlbeteiligung die Unzufriedenheit vieler Kambodschaner. Mangelndes Vertrauen in die Oppositionsparteien, wahrgenommene Aussichtslosigkeit und die Einschüchterung von Oppositionssympathisanten sind stattdessen als Ursachen zu nennen.
Herausforderungen für die Opposition im Zuge der Kommunalwahlen
Die Wählerschaft, die die Candlelight Party im Gegensatz zu anderen CNRP-Nachfolgeparteien hinter sich bringen konnte, hat sie eindeutig ihrer Verbindung zu Sam Rainsy und ihren Wurzeln in der Sam Rainsy Partei zu verdanken. Dies war einerseits von Nutzen für die Candlelight Party, andererseits leidet sie auch unter dem Personenkult. Die heutigen Candlelight Anführer Teav Vannol, Mitglieder der Nationalversammlung bis 2018 und die Vizepräsidenten Thach Setha und Son Chhay sind in der Bevölkerung nicht sonderlich bekannt und haben kein politisches Erbe und Image wie Sam Rainsy oder Kem Sokha. Da sich Rainsy zudem nicht direkt und offiziell an der Führung der Candlelight Party beteiligt, mögen manche Wähler der neuen Partei nicht trauen. Auch hat der Streit zwischen Sam Rainsy und Kem Sokha Folgen für die Partei. Dass Sokha trotz seines Rechts zu wählen nicht zur Wahl gegangen ist, zeigt wieder, dass er weder die CPP noch die Candlelight Party unterstützt.[ix] Vielmehr sind Kem Sokhas Anhänger heute mit dem Rainsy Lager verfeindet und würden deswegen prinzipiell nicht mit der Candlelight Party sympathisieren. Daher erklärt diese Spaltung der Opposition, dass die Candlelight Party nicht an den Erfolg der CNRP bei den Kommunalwahlen 2017 mit 43,8 Prozent anknüpfen konnte.
Weitere Schwierigkeiten für die Opposition brachte die Nationale Wahlkommission (National Election Commitee, NEC), die für die Organisation und Leitung der Kommunalwahlen verantwortlich ist. Sie soll unabhängig und neutral sein, um freie, faire und gerechte Wahlen in Übereinstimmung mit den Grundsätzen einer liberalen Mehrparteiendemokratie sicherzustellen.[x] Lokale Stakeholder zweifeln ihre politische Unabhängigkeit allerdings an. Das Komitee setzt sich aus neun Mitgliedern zusammen. Zwar ist vorgesehen, dass sowohl die Regierung als auch die Oppositionsparteien mit Sitz in der Nationalversammlung jeweils vier Mitglieder des NEC auswählen (zusätzlich wird im Konsensverfahren ein Vertreter aus der Zivilgesellschaft bestimmt). Jedoch sind drei der von der CNRP nominierten NEC-Mitglieder nach der Auflösung der Partei zurückgetreten. Zudem verfügt die Regierungspartei heute über alle Sitze in der Nationalversammlung. Dies hat zur Folge, dass sieben von neun Mitgliedern des NEC Verbindungen zur Regierungspartei CPP haben. Des Weiteren verfügt das Finanzministerium die Autorität über das Budget des NEC und könnte somit Einfluss auf das Komitee ausüben. [xi]
Grund zur Kritik am NEC gibt insbesondere die Disqualifizierung von Oppositionskandidaten im Vorfeld der Kommunalwahlen. So hat das Komitee bis vor dem offiziellen Registrierungsergebnis am 29. April 150 Kandidaten der Candlelight Party sowie 33 Kandidaten der Khmer Will Party ausgeschlossen.[xii] Begründet wurden Disqualifizierungen häufig mit dem Vorwurf, die Kandidaten seien Analphabeten. Das Gesetz erfordert, dass Kandidaten fähig sein müssen, die Landessprache Khmer zu lesen und schreiben. Zu kritisieren ist, dass das NEC in Folge teilweise ganze Wahllisten gestrichen hat. So waren etwa in der Kommune Tuol Svay Prey I in Phnom Penh alle 18 Kandidaten von der Wahl ausgeschlossen, nachdem vier Personen Analphabetismus vorgeworfen wurde.[xiii] Teilweise stand die Opposition wegen gestrichener Wahllisten also gar nicht zur Wahl. Das NEC bezeichnet den Ablauf der Wahlen als reibungslos, friedlich und frei von Einschüchterung.[xiv] Die Opposition berichtet dahingegen, bei den Wahlen sei es zu Unregelmäßigkeiten gekommen. Etwa seien Stimmen hinter verschlossenen Türen gezählt worden und Polizeibeamte hätten die Menschen mit ihrer Anwesenheit vor den Wahllokalen eingeschüchtert.[xv] Wegen des Mangels an unabhängigen internationalen Wahlbeobachtern können systematische Missstände aber nicht bestätigt werden.
Bedeutung der Kommunalwahlen auf nationaler Ebene
Auch wenn es Missstände bei den Wahlen gab, hat sich die Repräsentation auf kommunaler Ebene verbessert. Immerhin hat sich im de facto Einparteienstaat eine neue Oppositionspartei etablieren können, die nun für mehr „Checks-and-Balances“ in den Kommmunen sorgen kann. Für die Wahl des Senats 2024 bedeuten die Ergebnisse der Kommunalwahlen, dass die CPP ihre beinahe alleinige Kontrolle über das Oberhaus verlieren wird. Denn indirekt haben die Kommunalwahlen Einfluss auf die Zusammensetzung des Senats. 58 der 62 Mitglieder des Senats werden 2024 von den Gemeinderäten gewählt, weshalb sich die Stimme der Candlelight Party zukünftig im Senat wiederfinden dürfte.
Wichtiger noch ist der Ausblick auf die Wahl zur Nationalversammlung nächstes Jahr. Auch wenn die Candlelight Party ein ähnliches Wahlergebnis auf nationaler Ebene erzielen kann, hat ihr breiter Einzug ins Parlament noch Hürden zu überwinden. Das Wahlsystem zur Nationalversammlung bevorzugt eher größere Parteien. Der Anteil der Wählerstimmen kann nicht so einfach proportional auf den Anteil der Sitze in der Nationalversammlung übertragen werden. Schließlich sind in jeder der 25 Provinzen unterschiedlich viele Mandate zu vergeben und in das Parlament zu entsenden. Um stattdessen eine akkuratere Prognose abgeben zu können, ist dem Anhang eine Berechnung zu entnehmen. Aus dieser ergäben sich 17 Mandate für die Candlelight Party in den Wahlen zur Nationalversammlung. Dies entspricht einem 13,6 prozentigen Anteil der 125 Stimmen in der Nationalversammlung, anstatt die 22 Prozent der Wählerstimmen zu repräsentieren. Die Candlelight Party hat im nächsten Jahr aber noch die Chance, sich in den Gemeinderäten zu beweisen und mehr Wähler von sich zu überzeugen. Dies könnte vor allem in urbanen Räumen gelingen, etwa der Hauptstadt Phnom Penh, wo ganze 12 Mandate für die Nationalversammlung zu vergeben sind.
Wie geht es weiter?
In den letzten Monaten wurde in Kambodscha viel darüber spekuliert, wer Langzeitpremierminister Hun Sen in den nächsten Jahren aufgrund seines fortgeschrittenen Alters folgen soll.[xvi] Der Wahlerfolg der CPP in den Kommunalwahlen dürfte Hun Sens Plan, seinen Sohn Hun Manet als Nachfolger einzusetzen, bekräftigen. Hun Sen sieht im Wahlerfolg seiner Partei, dass Wähler ihn als Premierminister und ebenso seinen Sohn als Nachfolger unterstützen.[xvii] Spannend wird, an welchem Zeitpunkt Hun Sen die Macht an Hun Manet übergibt und welche Auswirkungen das Ende der Ära Hun Sen mit sich bringen wird. Für die Wahl zur Nationalversammlung nächstes Jahr hat Hun Sen seine Kandidatur bereits angekündigt.
Die Wahlen dürften auch Einfluss auf den Hochverratsprozess gegen den ehemaligen CNRP-Anführer Kem Sokhas haben. Der Prozess wurde bereits fünf Jahre verzögert und Sokha damit aus dem politischen Geschehen herausgehalten. Nach Stärkung der CPP im Zuge der Kommunalwahlen könnte allerdings endlich Bewegung in den Prozess kommen. Klar ist, dass Sokha im Falle seiner politischen Rehabilitierung nicht mit der Candlelight Party zusammenarbeiten würde. Zu tief ist die Spaltung zwischen den einstigen Partnern Rainsy und Sokha, die früher als eine Person bezeichnet wurden. Für die Demokratie in Kambodscha gibt es wieder leichte Hoffnung, auch wenn der Weg zum, in der Verfassung festgeschriebenen, Mehrparteiensystem noch lang ist.
Anhang
Eigene Darstellung: Projektion der Mandate für die Candlelight Party in den Wahlen zur Nationalversammlung
Es handelt sich um eine Projektion für die Wahlen zur Nationalversammlung im Jahr 2023, die verdeutlichen soll, dass durch das kambodschanische Wahlsystem für diese Wahlen große Parteien leichte Vorteile haben. Die Darstellung basiert auf zwei Annahmen. Erste Annahme: Die Candlelight Party erhält auch 2023 bei den Wahlen 22 Prozent der Stimmen. Zweite Annahme: Die Verteilung der Mandate ist so wie bei den Wahlen zur Nationalversammlung 2018. Berechnet wurde, was die beiden Annahmen für die Mandate der Candlelight Party bedeutet. Es wird so deutlich, dass 22 Prozent der Wählerstimmen, 13,6 Prozent der Mandate in der Nationalversammlung bedeuten könnte.
Provinz | Anzahl zu vergebender Mandate | Nötiger Stimmanteil pro Mandat | Anzahl der Mandate für CP (abegerundet) |
Banteay Meanchey Province |
6 | 16,67% | 1 |
Battambang Province |
8 | 12,5% | 1 |
Kampong Cham Province |
10 | 10% | 2 |
Kampong Chhnang Province |
4 | 25% | 0 |
Kampong Speu Province |
6 | 16,67% | 1 |
Kampong Thom Province |
6 | 16,67% | 1 |
Kampot Province |
6 |
16,67% |
1 |
Kandal Province |
11 | 9,09% | 2 |
Koh Kong Province |
1 | 50% | 0 |
Kratié Province |
3 | 33,33% | 0 |
Mondulkiri Province |
1 | 50% | 0 |
Phnom Penh |
12 | 8,33% | 2 |
Preah Vihear Province |
1 | 50% | 0 |
Prey Veng Province |
11 | 9,09% | 2 |
Pursat Province |
4 | 25% | 0 |
Ratanakiri Province |
1 | 50% | 0 |
Siem Reap Province |
6 | 16,67% | 1 |
Sihanoukville Province |
3 | 33,33% | 0 |
Stung Treng Province |
1 | 50% | 0 |
Svay Rieng Province |
5 | 20% | 1 |
Takéo Province |
8 | 12,5% | 1 |
Kep Province |
1 | 50% | 0 |
Pailin Province |
1 | 50% | 0 |
Oddar Meanchey Province |
1 | 50% | 0 |
Tboung Khmum Province |
8 | 12,5% | 1 |
Summe |
|||
25 Provinzen |
125 Sitze | 17 Mandate für Candlelight Party entsprechend 13,6% der Nationalversammlung |
[i] Phnom Penh Post. ”PM: Vote CPP”, 21.05.2022, https://www.phnompenhpost.com/national-politics/pm-vote-cpp [06.06.2022]
[ii] Sokhean, Ben. ”Election fever: Parties kick off polls campaigns with sweet promises”, 23.05.2022, https://www.khmertimeskh.com/501079985/election-fever-parties-kick-off-polls-campaigns-with-sweet-promises/ [06.06.2022]
[iii] Sopha, Mao; Sopich, Sam.“Candlelight Party Promises Higher Education for Everyone”, 23.05.2022, https://cambodianess.com/article/candlelight-party-promises-higher-education-for-everyone [06.06.2022]
[iv] Sokhean, Ben. “Opposition CP hopeful of winning commune elections”, 06.05.2022, https://www.khmertimeskh.com/501070023/opposition-cp-hopeful-of-winning-commune-elections/ [06.06.2022]
[v] Narim, Khuon. “Uneven Playing Field as Splintered Opposition Parties Prepare for 2022 Commune Elections”,16.12.2021, https://cambojanews.com/uneven-playing-field-as-splintered-opposition-parties-prepare-for-2022-commune-elections/ [06.06.2022]
[vi] The Asian Network for Free Elections. “ANFREL Pre-Election Assessment Mission Report“: S. 8, 06.05.2022, https://anfrel.org/wp-content/uploads/2022/05/ANFREL-Pre-Election-Assessment-Mission-Report-Cambodia-2022-Commune-and-Sangkat-Council-Elections.pdf [06.06.2022]
[vii] Samean,Lay; Sivutha, Nov. “78% turnout at ‘smooth’ commune elections: NEC”, 06.06.2022, https://www.phnompenhpost.com/national-politics/78-turnout-smooth-commune-elections-nec [08.06.2022]
[viii] Gradwohl, Rene; Hör, Robert. “Kommunalwahlen in Kambodscha: Stimmungstest und Wegweiser für die Nationalwahlen 2018”: S. 4, 05.07.2018, https://www.kas.de/documents/252038/253252/7_dokument_dok_pdf_49110_1.pdf/fcb4c848-2152-4e13-da03-415673d51484?version=1.0&t=1539649045290 [08.06.2022]
[ix] Hutt, David. “ Hun Sen wins another one-horse race in Cambodia“, 06.06.2022, https://asiatimes.com/2022/06/hun-sen-wins-another-one-horse-race-in-cambodia/ [08.06.2022]
[x] The National Election Committee. “History of NEC”, https://www.nec.gov.kh/english/content/history-nec [06.06.2022]
[xi] The Asian Network for Free Elections. “ANFREL Pre-Election Assessment Mission Report“: S. 12, 06.05.2022, https://anfrel.org/wp-content/uploads/2022/05/ANFREL-Pre-Election-Assessment-Mission-Report-Cambodia-2022-Commune-and-Sangkat-Council-Elections.pdf [06.06.2022]
[xii] The Asian Network for Free Elections. “ANFREL Pre-Election Assessment Mission Report“: S. 20, 06.05.2022, https://anfrel.org/wp-content/uploads/2022/05/ANFREL-Pre-Election-Assessment-Mission-Report-Cambodia-2022-Commune-and-Sangkat-Council-Elections.pdf [06.06.2022]
[xiii] Narim, Khuon; Thaney,Try. “In unusual move, NEC cuts entire Candlelight candidate list in one Phnom Penh commune”, 22.03.2022, https://cambojanews.com/in-unusual-move-nec-cuts-entire-candlelight-candidate-list-in-one-phnom-penh-commune/ [06.06.2022]
[xiv] Khmer Times. “5th Commune/Sangkat Council Election held successfully”,06.06.2022, https://www.khmertimeskh.com/501088851/5th-commune-sangkat-council-election-held-successfully/ [08.06.2022]
[xv] Ouch, Sony; Mech, Dara; Dickinson, Michael: “Voter Sentiment or Irregularities? Theories Abound Over Landslide Election”, 06.06.2022, https://vodenglish.news/voter-sentiment-or-irregularities-theories-abound-over-landslide-election/ [08.06.2022]
[xvi] Paciello, Mauizio: ”Kambodschas neue Dynastie? Die Debatte um die Nachfolge von Premierminister Hun Sen”, 09.12.2021, https://www.kas.de/de/laenderberichte/detail/-/content/kambodschas-neue-dynastie [09.06.2022]
[xvii] Turton, Shaun: ”Cambodia's Hun Sen defends succession plan, denies China 'debt trap'”, 27.05.2022, https://asia.nikkei.com/Spotlight/The-Future-of-Asia/The-Future-of-Asia-2022/Cambodia-s-Hun-Sen-defends-succession-plan-denies-China-debt-trap [08.06.2022]
тема
обезбеђено од стране
Auslandsbüro Kambodscha
о овој серији
Fondacija Konrad Adenauer zastupljena je u preko 80 država, na svih pet kontinenata. Direktori predstavništava izveštavaju sa lica mesta o aktuelnim događajima i dugoročnim tendencijama. "Izveštaji iz Srbije" nude korisnicima internet-stranice Fondacije Konrad Adenauer ekskluzivne analize, pozadinske informacije i procene.